Ho il mio codice Python in una cartella chiamata "project", quindi i miei file di codice sono in project/*. Py. Voglio avere sottomoduli al suo interno, ad es.organizzazione del modulo pythonic - come fare riferimento ai file nella directory principale?
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
ogni directory modulo ha la sua init di file .py, per esempio
project/mymodule1/__init__.py
supponiamo di avere un file "test.py" entro myModule1 (progetto/myModule1/test.py) e mi piacerebbe fare riferimento a qualcosa da "codice", per esempio importare la funzione "myfunc"
== project/mymodule1/test.py ==
from code import myfunc
il problema è che "codice" non verrà trovato meno che l'utente ha posto la directory "progetto /" nel loro PYTHONPATH. C'è un modo per evitarlo e utilizzare una sorta di "percorso relativo" per importare myfunc, ad es.
from ../code import myfunc
in fondo, io non voglio obbligare gli utenti del codice per modificare il PYTHONPATH a meno che non posso farlo a livello di codice per loro da dentro il mio script. Mi piacerebbe che funzionasse fuori dagli schemi.
Come si può fare? o la soluzione è buona: alterare PYTHONPATH a livello di codice, o più idealmente, riferendosi al "codice" usando un qualche tipo di importazione relativa, poiché anche se non so dove "project/code.py" risiede sul computer dell'utente, so dove è relativo a "myfunc".
MODIFICA: Qualcuno può mostrare un esempio corretto dell'importazione intra-pacchetto? Ho cercato, da "myModule1" da fare:
from .. import foo
dove "foo" è in code.py, ma non funziona. Ho init .py in myModule1, quindi:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
dove module1_code.py cerca di importare foo, una funzione definita in "code.py".
EDIT: La confusione principale che ho ancora è che, anche dopo l'adozione l'esempio dato in risposta al mio messaggio, che mostra la gerarchia del progetto/sub1/test, si può ancora "cd" in sub1 e fare "python test.py "e farlo funzionare. L'utente deve essere nella directory contenente "project" e fare "import project.sub1.test". Mi piacerebbe che funzionasse a prescindere dalla directory in cui si trova l'utente. L'utente in questo caso deve eseguire il file "test.py", che vive in project/sub1 /. Quindi il banco di prova è:
$ cd project/sub1
$ python test.py
che produce l'errore:
ValueError: Attempted relative import in non-package
come può essere fisso?
grazie.
'code.py' importa anche' mymodule1/test.py'? Se è così, vorrai guardare a riorganizzare il tuo codice. Le importazioni circolari dovrebbero essere evitate se possibile. – Wilduck