1

Ich habe mir die meisten Links zu relativen Importen und insbesondere zu den Top-Level-Paketen angeschaut, aber ich habe immer noch Schwierigkeiten, meinen Verwandten zu finden Importcode zum arbeiten. Als Referenz verwende ich Python 3.6.Versuchter relativer Import über das Paket der obersten Ebene hinaus mit python -m

Ich habe ein Verzeichnis von Tests, die ich ausführen möchte, isoliert in einem eigenen Verzeichnis, Tests. Ich möchte alle Modulpakete in eine Datei namens InputTests.py importieren. Hier ist das Format meines Projektverzeichnisses. file directory

Innerhalb InputTests.py, ich versuche Module auf diese Weise zu importieren:

from .. import modules

ich den Fehler:

File "/Users/wfehrnstrom/Desktop/meeting_minutes/tests/InputTests.py", 
line 2, in <module> 
from .. import modules 
ValueError: attempted relative import beyond top-level package<code> 

aber ich bin mit dem Befehl: python -m tests.InputTests, was dem Interpreter angeblich sagt, dass er alles von meinem obersten Verzeichnis aus ausführen soll. Ich denke also, meine Frage ist, warum meine relative Import-Anweisung nicht funktioniert, wenn ich bedenke, dass ich dies aus dem obigen Paket heraus ausführe. Dieser Stack-Überlauf Post schien zum Detail, was ich brauche, aber ihre Lösung, mit -m läuft für mich nicht funktioniert: How to do relative imports in Python?

Darüber hinaus scheint es einen Widerspruch zu diesem in diesem Stack-Überlauf Post zu sein: Relative importing modules from parent folder subfolder

Der letzte Beitrag scheint darauf hinzuweisen, dass die Kontextbedeutung von .. und. Ändern Sie nicht basierend auf der Stelle, an der Sie Ihren Python-Befehl ausführen, der erste besagt jedoch, dass dies der Fall ist. Das hat mich extrem verwirrt. Kann jemand die relativen Importe klären und diese Diskrepanz auflösen? Vielen Dank.

Antwort

0

Ich kann nur versuchen, Ihre Frage für Python 2.7 zu beantworten, aber ich hoffe, dass dies sowieso hilfreich ist.

PEP 328, die in der Antwort auf "Wie importieren Sie relative Importe in Python?" Sie verlinkt ist teilweise veraltet, da es schlägt vor, basierend auf der __name__ des Moduls zu importieren, die __main__ für das Hauptskript wäre und daher verhindern, relative Importe in diesem Modul überhaupt zu verwenden, selbst wenn -m verwenden.

PEP 366 löste dies durch die Einführung der __package__ Attribut.

Wenn Sie python -m tests.InputTests verwenden, wird der Wert __package__ in InputTests.pytests sein. Dies ermöglicht den Import von übergeordneten Paketen nicht, da tests das aktuelle und das oberste Paket ist.

Running python -m modules.tests.InputTests im Verzeichnis "meeting_minutes" sollte das lösen.

Verwandte Themen