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.pydefinisce 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.pyin 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_1in 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_1a 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.pyfare 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.pystesso. Quindi se non c'è un punto, main.pyriconoscerà module_1nella stessa gerarchia di se stesso, può riconoscere package_1, ma non cosa "sotto".
Ora rendiamolo un po 'complicato. Hai un config.inie 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.pynon 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.