Ich bin nicht erfahren über Python, so dass, wenn es irgendwelche falsch in meine Worte, sagen Sie mir. Wenn Ihre Dateihierarchie wie folgt angeordnet ist:
project\
module_1.py
module_2.py
module_1.py
definiert eine Funktion namens func_1()
, modul_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
und Sie laufen python module_2.py
in cmd, es wird ausgeführt, was func_1()
definiert. Normalerweise importieren wir auf diese Weise gleiche Hierarchiedateien. Aber wenn Sie schreiben from .module_1 import func_1
en module_2.py
wird der 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 erstellen ein drittes Modul als Aufrufer, um 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 .
vor module_1
en module_2.py
ist, dass wir, wenn wir das nicht tun und main.py
wird der Python-Interpreter sagen No module named 'module_1'
das ist ein bisschen schwierig, module_1.py
ist direkt neben dem module_2.py
. Jetzt lasse ich func_1()
en module_1.py
etwas tun:
def func_1():
print(__name__)
dass __name__
erfasst, wer func_1 aufruft. Jetzt behalten wir die .
vor module_1
, laufen main.py
wird folgendes gedruckt package_1.module_1
, nicht module_1
. Es bedeutet, dass derjenige, der anruft func_1()
steht auf der gleichen Hierarchieebene wie main.py
le .
bedeuten, dass module_1
steht auf der gleichen Hierarchieebene wie module_2.py
selbst. Wenn also kein Punkt vorhanden ist, main.py
wird erkennen module_1
auf derselben Hierarchieebene wie sie selbst, kann sie erkennen package_1
aber nicht das, was "darunter" ist.
Jetzt machen wir es ein bisschen komplizierter. Sie haben eine config.ini
und ein Modul definiert eine Funktion, um es in der gleichen Hierarchie wie "main.py" zu lesen.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Und aus irgendeinem unvermeidlichen Grund müssen Sie es mit module_2.py
Daher muss es aus der oberen Hierarchie importiert werden. modul_2.py :
import ..config
pass
Zwei Punkte bedeuten, dass die Einfuhr aus der oberen Hierarchie erfolgt (drei Punkte bedeuten, dass die Einfuhr aus der oberen Hierarchie erfolgt und so weiter). Jetzt führen wir main.py
wird die Dolmetscherin sagen: ValueError:attempted relative import beyond top-level package
. Das "Top-Level-Paket" ist hier main.py
. Nur weil config.py
liegt neben main.py
sind sie auf derselben Hierarchieebene angesiedelt, config.py
ist nicht "unter" main.py
oder es wird nicht "geführt" von main.py
so ist es jenseits main.py
. Der einfachste Weg, dies zu beheben, ist:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Ich denke, dass das mit dem Prinzip der Projektdateihierarchie übereinstimmt, man sollte Module mit verschiedenen Funktionen in verschiedenen Ordnern anordnen, und einfach einen Top-Caller außen vor lassen, und man kann importieren, wie immer man will.
3 Stimmen
Sieht aus wie stackoverflow.com/questions/72852/ vielleicht?
3 Stimmen
Prüfen Sie meine Antwort, es ist die vollständigste bisher, andere funktionieren nicht in speziellen Fällen, zum Beispiel, wenn Sie das Skript aus einem anderen Verzeichnis oder aus einem anderen Python-Skript aufrufen. Siehe stackoverflow.com/questions/279237/
0 Stimmen
Ich hatte ein ähnliches Problem und ich fand dies und es funktioniert!! apt-get install python-profiler
5 Stimmen
Nur für den Fall, dass jemand es statisch machen will und hierher kommt (so wie ich :), kann man auch die Umgebungsvariable PYTHONPATH einrichten
0 Stimmen
Besser ist es, die Anweisungen in Lib/site.py für jeden Fall zu befolgen
0 Stimmen
Ist damit Ihre Frage beantwortet? Wie importiert man die Klasse innerhalb desselben Verzeichnisses oder Unterverzeichnisses?