Zunächst einmal: Es tut mir leid, ich weiß, dass es viele Fragen zu relativen Importen gab, aber ich habe einfach keine Lösung gefunden. Wenn möglich möchte ich folgendes Verzeichnislayout verwenden:
myClass/
__init__.py
test/
demo.py
benchmark.py
specs.py
src/
__init__.py
myClass.py
Jetzt sind meine Fragen:
Wie importieren die Testdateien aus dem Paket myClass.py ordnungsgemäß?
Wie würden Sie das Paket von außen importieren, vorausgesetzt, Sie nehmen myClass als Submodul in libs / myClass oder include / myClass?
Bisher konnte ich dafür keine elegante Lösung finden. Soweit ich Guidos Entscheidung verstehe , sollte es möglich sein, dies zu tun, from ..src import myClass
aber dies wird einen Fehler machen:
ValueError: Attempted relative import in non-package
Das sieht so aus, als würde myClass nicht als Paket behandelt. Lesen Sie die Dokumente :
Die Dateien __init__.py sind erforderlich, damit Python die Verzeichnisse als Pakete enthaltend behandelt.
Es scheint, dass mir etwas fehlt, das angibt, wo sich die Skripte des Pakets befinden. Soll ich .pth verwenden?
quelle
__init__.py
imtest
Verzeichnis?ValueError: Attempted relative import in non-package
könnte damit zusammenhängen.Antworten:
Bedeutet, dass Sie versuchen, den relativen Import in dem Modul zu verwenden, das kein Paket ist. Sein Problem mit der Datei, die dies hat
from ... import
Anweisung enthält, und nicht mit der Datei, die Sie importieren möchten.Wenn Sie beispielsweise in Ihren Tests relative Importe durchführen, sollten Sie Ihre Tests als Teil Ihres Pakets festlegen. Das heisst
__init__.py
Zum Test /Wenn Sie etwas als ausführen
python myClass/test/demo.py
, funktionieren relative Importe auch nicht, da Sie das Demomodul nicht als Paket ausführen . Relative Importe erfordern, dass das Modul, das sie verwendet, selbst entweder als Paketmodulfrom myClass.test.demo import blabla
oder mit relativem Import importiert wird.quelle
Nachdem ich letzte Nacht stundenlang gesucht hatte, fand ich die Antwort auf relative Importe in Python !! Oder zumindest eine einfache Lösung. Der beste Weg, dies zu beheben, besteht darin, die Module von einem anderen Modul aufrufen zu lassen. Angenommen, Sie möchten
demo.py
importierenmyClass.py
. ImmyClass
Ordner im Stammverzeichnis der Unterpakete muss eine Datei vorhanden sein, die die beiden anderen aufruft. Soweit ich weiß, wird das Arbeitsverzeichnis immer berücksichtigt.__main__
Wenn Sie den Importdemo.py
mit demdemo.py
Skript testen , wird dieser Fehler angezeigt. Um zu veranschaulichen:Ordnerhierarchie:
myClass/ main.py #arbitrary name, can be anything test/ __init__.py demo.py src/ __init__.py myClass.py
myClass.py:
def randomMaths(x): a = x * 2 y = x * a return y
demo.py:
from ..src import myClass def printer(): print(myClass.randomMaths(42))
main.py:
import test.demo demo.printer()
Wenn Sie
demo.py
im Interpreter ausgeführt werden, wird ein Fehler generiert, beim Ausführenmain.py
jedoch nicht. Es ist ein wenig verworren, aber es funktioniert: D.quelle
__init__.py
. Zweitens habe ich demo.printer () in geänderttest.demo.printer()
. Drittens habe ich das Verzeichnis über der main.py gewechselt und bin gelaufenpython -m myClass.main
. Ansonsten war dies eine sehr hilfreiche Antwort für mich. :)Intra-Package-Referenzen beschreiben, wie man
myClass
vontest/*
. Um das Paket von außen zu importieren, sollten Sie seinen Pfad zurPYTHONPATH
Umgebungsvariablen hinzufügen , bevor Sie die Importer-Anwendungsys.path
ausführen , oder vor dem Import im Code auflisten.Warum
from ..src import myClass
fehlschlägt: Wahrscheinlichsrc
handelt es sich nicht um ein Python-Paket, das Sie nicht von dort importieren können. Sie sollten es wie oben beschrieben zum Python-Pfad hinzufügen.quelle