[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?




Dal momento che la tua domanda sembra specifica * nix, penso che un modo pulito sarebbe utilizzare la variabile di ambiente

PYTHONPATH

come descritto nella documentazione: Python2 , Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH



Ha funzionato per me in python3 su linux

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  



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.

(Spero che questo risolva il tuo problema!)




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 .




sys.path.insert(0, '/path/to/application/app/folder')