[Python] Importazione di file da una cartella diversa


Answers

Non c'è niente di sbagliato in:

from application.app.folder.file import func_name

Assicurati che la cartella contenga anche un __init__.py , questo consente di includerlo come pacchetto. Non sono sicuro del perché le altre risposte parlino di PYTHONPATH.

Question

Ho la seguente struttura di cartelle.

application/app/folder/file.py

e voglio importare alcune funzioni da file.py in un altro file Python che risiede in

application/app2/some_folder/some_file.py

ho provato

from application.app.folder.file import func_name

e alcuni altri vari tentativi ma fino ad ora non sono riuscito a importare correttamente. Come posso fare questo?




Nel mio caso ho avuto una classe da importare. Il mio file assomigliava a questo:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

Nel mio file principale ho incluso il codice tramite:

path.append("/opt/path/to/code/")
from log_helper import LogHelper



Considerando l' application come directory root per il tuo progetto python, crea un file __init__.py vuoto nelle cartelle application , app e folder . Quindi nel tuo some_file.py fai le modifiche come segue per ottenere la definizione di func_name:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()






L'utilizzo di sys.path.append con un percorso assoluto non è l'ideale quando si sposta l'applicazione in altri ambienti. L'utilizzo di un percorso relativo non funzionerà sempre perché la directory di lavoro corrente dipende da come viene eseguito lo script.

Poiché la struttura della cartella dell'applicazione è fissa, possiamo utilizzare os.path per ottenere il percorso completo. Ad esempio, se questa è la struttura:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

E diciamo che vuoi importare il modulo "mango". Potresti fare quanto segue in vanilla.py:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

Certo, non hai bisogno della variabile mango_dir.

Per capire come funziona guarda questo esempio di sessione interattiva:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

E controlla la documentazione di os.path .




Questo funziona per me su Windows

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file



Il tuo problema è che Python sta cercando nella directory Python questo file e non lo trova. Devi specificare che stai parlando della directory in cui ti trovi e non di quella Python.

Per fare questo si cambia questo:

from application.app.folder.file import func_name

a questa:

from .application.app.folder.file import func_name

Aggiungendo il punto che stai dicendo cerca in questa cartella la cartella dell'applicazione invece di cercare nella directory Python.




Sono piuttosto speciale: utilizzo Python con Windows!

Completo semplicemente le informazioni: per Windows e Linux, sia il percorso relativo sia il percorso assoluto in sys.path (ho bisogno di percorsi relativi perché uso i miei script sui vari PC e sotto diverse directory principali).

E quando si usa Windows sia \ e / può essere usato come separatore per i nomi di file e, naturalmente, è necessario raddoppiare \ nelle stringhe Python,
alcuni esempi validi:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(nota: penso che / sia più conveniente di \ , event se è meno 'nativo di Windows' perché è compatibile con Linux e più semplice da scrivere e copiare su Windows explorer)