Nie mam doświadczenia w pythonie, więc jeśli w moich słowach jest coś złego, po prostu powiedz mi. Jeśli hierarchia plików ułożona jest w następujący sposób:
project\
module_1.py
module_2.py
module_1.py
definiuje funkcję o nazwie func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
i uruchomisz python module_2.py
w cmd, wykona to, co func_1()
definiuje. Tak zazwyczaj importujemy te same pliki hierarchii. Ale kiedy piszesz from .module_1 import func_1
w module_2.py
, interpreter Pythona powie No module named '__main__.module_1'; '__main__' is not a package
. Aby to naprawić, po prostu zachowujemy zmiany, które właśnie wprowadzamy, i przenosimy oba moduły do pakietu, i uruchamiamy trzeci moduł jako program wywołujący 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()
Ale powodem dodamy .
zanim module_1
w module_2.py
to, że jeśli nie zrobimy tego i run main.py
, interpreter Pythona powie No module named 'module_1'
, że to trochę skomplikowane, module_1.py
jest tuż obok module_2.py
. Teraz niech func_1()
się module_1.py
coś zrobić:
def func_1():
print(__name__)
który __name__
rejestruje, kto dzwoni do func_1. Teraz trzymamy .
przed module_1
, uruchom main.py
, wydrukuje package_1.module_1
, a nie module_1
. Wskazuje, że ten, kto dzwoni, func_1()
jest w tej samej hierarchii main.py
, co .
implikuje, że module_1
jest w tej samej hierarchii co on module_2.py
sam. Więc jeśli nie ma kropki, main.py
rozpozna module_1
w tej samej hierarchii co ona, może rozpoznać package_1
, ale nie to, co „pod” nią.
Teraz zróbmy to trochę skomplikowanym. Masz a config.ini
i moduł definiuje funkcję do odczytu w tej samej hierarchii co 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
I z jakiegoś nieuniknionego powodu musisz do niego zadzwonić module_2.py
, więc musi zostać zaimportowany z wyższej hierarchii. moduł_2.py :
import ..config
pass
Dwie kropki oznaczają import z górnej hierarchii (trzy kropki mają dostęp do górnej niż górnej itd.). Teraz możemy uruchomić main.py
interpreter powie: ValueError:attempted relative import beyond top-level package
. „Pakiet najwyższego poziomu” tutaj main.py
. Tylko dlatego , że config.py
jest obok main.py
, są oni w tej samej hierarchii, config.py
nie jest „pod” main.py
lub nie jest „prowadzony” przez main.py
, więc jest poza main.py
. Aby to naprawić, najprostszym sposobem jest:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Myślę, że jest to zbieżne z zasadą hierarchii plików projektu, powinieneś rozmieścić moduły z różnymi funkcjami w różnych folderach i po prostu zostawić górnego rozmówcę na zewnątrz, i możesz importować, jak tylko chcesz.