Oltre ai moduli, Python offre un ulteriore livello di organizzazione: i package. Un package è una raccolta di moduli, che in genere corrisponde alla directory che li contiene. Prima di poter importare i moduli da una directory, è necessario aggiungere un file vuoto chiamato __init__.py all'interno della directory. Vediamo ad esempio la struttura che potrebbe avere un ipotetico progetto Python:
ProgettoPython/
|- main.py
`- progetto/
|- __init__.py
|- core.py
|- utils.py
|- gui/
| |- __init__.py
| |- widgets.py
| `- windows.py
`- test/
|- __init__.py
|- test_core.py
|- test_utils.py
|- test_widgets.py
`- test_windows.py
La directory che contiene il nostro progetto si chiama ProgettoPython e contiene un file main.py e il package progetto. La directory progetto contiene un file __init__.py che la rende un package importabile da Python, oltre ai file core.py e utils.py e le sottocartelle gui e test. Le sottocartelle contengono a loro volta due file __init__.py che le rendono parte del package, e diversi altri file .py.
In questo caso la root (radice) del package è progetto, e per poterla importare dobbiamo garantire che la cartella che lo contiene (cioè ProgettoPython) sia inclusa in sys.path
. Possiamo farlo sia lanciando python3
direttamente dalla cartella ProgettoPython (la cartella corrente viene aggiunta automaticamente a sys.path
), oppure aggiungendo il percorso completo della directory (es. /home/ezio/ProgettoPython) alla variabile di ambiente PYTHONPATH
.
Possiamo ora identificare i package e sub-package all'intero degli import
, separandoli con un .
. Ad esempio, per importare utils
possiamo scrivere import progetto.utils
o from progetto import utils
. Se vogliamo importare una funzione da utils
, possiamo usare from progetto.utils import funzione
. Se vogliamo importare un widget da widgets
, possiamo usare from progetto.gui.widgets import widget
.