Non ho esperienza di Python, quindi se c'è qualcosa di sbagliato nelle mie parole, dimmelo. Se la gerarchia dei file è disposta in questo modo:
project\
module_1.py
module_2.py
module_1.py
definisce una funzione chiamata func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
e corri python module_2.py
in cmd, eseguirà ciò che func_1()
definisce. Di solito è così che importiamo gli stessi file della gerarchia. Ma quando si scrive from .module_1 import func_1
in module_2.py
, interprete Python dirà No module named '__main__.module_1'; '__main__' is not a package
. Quindi, per risolvere questo problema, manteniamo solo le modifiche che facciamo, spostiamo entrambi i moduli in un pacchetto e facciamo un terzo modulo come chiamante da eseguire module_2.py
.
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Ma la ragione si aggiunge una .
prima module_1
a module_2.py
è che se non lo facciamo ed eseguire main.py
, interprete Python dirà No module named 'module_1'
, che è un po 'difficile, module_1.py
è proprio accanto module_2.py
. Ora lascio func_1()
a module_1.py
fare qualcosa:
def func_1():
print(__name__)
che __name__
registra chi chiama func_1. Ora manteniamo il .
precedente module_1
, eseguiamo main.py
, stamperà package_1.module_1
, no module_1
. Indica che colui che chiama func_1()
è nella stessa gerarchia di main.py
, .
implica che module_1
è nella stessa gerarchia di se module_2.py
stesso. Quindi se non c'è un punto, main.py
riconoscerà module_1
nella stessa gerarchia di se stesso, può riconoscere package_1
, ma non cosa "sotto".
Ora rendiamolo un po 'complicato. Hai un config.ini
e un modulo definisce una funzione per leggerlo nella stessa gerarchia di 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
E per qualche motivo inevitabile, devi chiamarlo con module_2.py
, quindi deve importare dalla gerarchia superiore. module_2.py :
import ..config
pass
Due punti indicano l'importazione dalla gerarchia superiore (tre punti accedono alla parte superiore della parte superiore e così via). Ora corriamo main.py
, l'interprete dirà: ValueError:attempted relative import beyond top-level package
. Il "pacchetto di livello superiore" qui è main.py
. Solo perché config.py
è accanto main.py
, sono nella stessa gerarchia, config.py
non sono "sotto" main.py
, o non sono "guidati" da main.py
, quindi è oltre main.py
. Per risolvere questo problema, il modo più semplice è:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Penso che coincida con il principio di organizzare la gerarchia dei file di progetto, dovresti disporre i moduli con funzioni diverse in cartelle diverse e lasciare un chiamante superiore all'esterno e puoi importare quanto vuoi.