7.2 Distribuzione di Python puro (tramite package)

Se si ha a disposizione più di una coppia di moduli da distribuire, specialmente se risiedono in package multipli, è probabilmente più facile specificare l'intero gruppo di package anziché ogni package individualmente. Questo funziona anche se il modulo non è in un package; si può semplicemente dire alle Distutils di elaborare i moduli dal package principale e tutto funziona nello stesso modo, come per ogni altro package (eccetto il caso in cui non si abbia un file __init__.py).

Lo script di setup dell'ultimo esempio potrebbe anche essere scritto come:

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=[''],
      )
(La stringa vuota identifica il package principale).

Se questi due file vengono spostati in una sottodirectory, ma restano nel package principale, per esempio:

<root>/
        setup.py
        src/      foo.py
                  bar.py
si dovrebbe specificare il package principale, ma si deve dire anche alle Distutils dove i file sorgenti del package principale risiedono:
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      package_dir={'': 'src'},
      packages=[''],
      )

Solitamente, comunque, si vorranno distribuire molti moduli nello stesso package (o sottopackage). Per esempio, se i moduli foo e bar fanno parte del package foobar, un modo di dichiarare il proprio albero dei sorgenti è

<root>/
        setup.py
        foobar/
                 __init__.py
                 foo.py
                 bar.py
Questo è infatti lo schema predefinito che le Distutils si attendono, ed è quello che richiede il minimo impegno per la descrizione nel proprio script di setup:
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['foobar'],
      )

Se si vogliono inserire i moduli in directory non dichiarate per i loro package, si deve utilizzare nuovamente l'opzione package_dir. Per esempio, se la directory src contiene i moduli del package foobar:

<root>/
        setup.py
        src/
                 __init__.py
                 foo.py
                 bar.py
uno script di setup appropriato potrebbe essere
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      package_dir={'foobar': 'src'},
      packages=['foobar'],
      )

Altrimenti, se si volesse inserire i moduli del proprio package principale direttamente nella radice della distribuzione:

<root>/
        setup.py
        __init__.py
        foo.py
        bar.py
in questo caso lo script di setup sarebbe
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      package_dir={'foobar': ''},
      packages=['foobar'],
      )
(La stringa vuota indica anche la directory corrente.)

Se si hanno delle sottodirectory, devono essere esplicitamente elencate in packages, ma ogni voce in package_dir automaticamente si estende ai sotto package. (In altre parole, le Distutils non analizzano il proprio albero dei sorgenti, provando ad individuare quale directory corrisponda al package Python e cercando i file __init__.py. Comunque, se lo schema predefinito compone il sotto package:

<root>/
        setup.py
        foobar/
                 __init__.py
                 foo.py
                 bar.py
                 subfoo/
                           __init__.py
                           blah.py
il corrispondente script di setup potrebbe essere
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['foobar', 'foobar.subfoo'],
      )
(Nuovamente, la stringa vuota in package_dir è per la directory corrente).

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.