In questa guida vediamo come importare delle classi Python che sono contenute in una parent directory. Referenziare ed importare moduli contenuti in una directory padre non è consentito dalla Python 3.3 e successive. Vediamo di affrontare il problema con uno scenario concreto.
Scenario
Abbiamo la seguente struttura di cartelle e file python:
app
-classes
-car.py
-bike.py
-scripts
-run.py
Dallo script run.py vogliamo importare la classe car.py e bike.py, ma per quanto detto precedentemente, non possibile importare un modulo contenuto in una directory padre o in altra sua sottodirectory, pertanto ci si imbatte in un errore simile a questo:
Traceback (most recent call last):
File "/app/scripts/run.py", line 6, in
from classes.car import *
ModuleNotFoundError: No module named 'classes'
Soluzione 1: Usare il metodo sys.path
In questo caso utilizziamo il modulo sys ed impostiamo il path che porta al modulo richiesto.
Aggiungiamo il percorso al sys.path utilizzando il metodo append(). Questo metodo viene utilizzato per aggiungere uno specifico percorso da rendere disponibile agli interpreti per le loro ricerche delle classi.
import sys
# setting path
sys.path.append('/app/classes')
# importing
from car import *
from bike import *
# using
get_car_brand()
set_bike_model('Ducati')
Soluzione 2: Usare il metodo os.path.abspath()
In questo caso utilizziamo il modulo sys unitamente al modulo path per estrarre la directory contenente le classi da importare e successivamente aggiungerla al path.
import pathlib
import sys
# directory reach
directory = pathlib.Path(__file__).parent.resolve()
print(directory.parent)
# setting path
sys.path.append(str(directory.parent) + "/classes")
# importing
from car import *
from bike import *
# using
get_car_brand()
set_bike_model('Ducati')