Ich habe keine Erfahrung mit Python. Wenn meine Worte falsch sind, sag es mir einfach. Wenn Ihre Dateihierarchie so angeordnet ist:
project\
module_1.py
module_2.py
module_1.py
definiert eine Funktion aufgerufen func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
und wenn Sie python module_2.py
in cmd ausführen , wird ausgeführt, was func_1()
definiert ist. So importieren wir normalerweise dieselben Hierarchiedateien. Aber wenn Sie schreiben from .module_1 import func_1
in module_2.py
, wird Python - Interpreter sagen No module named '__main__.module_1'; '__main__' is not a package
. Um dies zu beheben, behalten wir einfach die Änderung bei, die wir gerade vorgenommen haben, und verschieben beide Module in ein Paket und lassen ein drittes Modul als Aufrufer ausführen 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()
Aber der Grund , warum wir eine hinzufügen , .
bevor module_1
in module_2.py
ist , dass , wenn wir nicht tun , dass und ausführen main.py
, wird Python - Interpreter sagen No module named 'module_1'
, dass ein wenig kompliziert ist, module_1.py
ist direkt neben module_2.py
. Nun lasse ich func_1()
in module_1.py
do etwas:
def func_1():
print(__name__)
das __name__
zeichnet auf, wer func_1 aufruft. Jetzt behalten wir das .
vorher module_1
, laufen main.py
, es wird gedruckt package_1.module_1
, nicht module_1
. Es zeigt an, dass sich derjenige, der anruft, func_1()
in derselben Hierarchie wie befindet main.py
, was .
bedeutet, dass er module_1
sich in derselben Hierarchie wie er module_2.py
selbst befindet. Wenn es also keinen Punkt gibt, main.py
der module_1
an derselben Hierarchie wie er selbst erkennt, kann er erkennenpackage_1
, , aber nicht, was "darunter" ist.
Lassen Sie es uns jetzt etwas komplizierter machen. Sie haben ein config.ini
und ein Modul definiert eine Funktion zum Lesen in derselben Hierarchie wie 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Und aus irgendeinem unvermeidlichen Grund muss man es mit aufrufen module_2.py
, damit es aus der oberen Hierarchie importiert werden kann. module_2.py :
import ..config
pass
Zwei Punkte bedeuten den Import aus der oberen Hierarchie (drei Punkte greifen auf die oberen als die oberen usw. zu). Jetzt rennen wir main.py
, der Dolmetscher wird sagen : ValueError:attempted relative import beyond top-level package
. Das "Top-Level-Paket" hier ist main.py
. Nur weil sie config.py
daneben liegen main.py
, befinden sie sich in derselben Hierarchie, config.py
sind nicht "unter" main.py
oder werden nicht "angeführt" main.py
, also ist es jenseits main.py
. Um dies zu beheben, ist der einfachste Weg:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Ich denke, das stimmt mit dem Prinzip der Anordnung der Projektdateihierarchie überein. Sie sollten Module mit unterschiedlichen Funktionen in verschiedenen Ordnern anordnen und nur einen Top-Aufrufer im Freien lassen, und Sie können importieren, wie immer Sie wollen.