2016-03-24 6 views
1

Ich habe ein Python-Modul, an dem ich arbeite, um einige Komponententests hinzuzufügen.Warum kann ich ein Modul (mit einem relativen Pfad) nicht von seinen Unit-Tests referenzieren?

Das Projekt Layout sieht ungefähr so ​​aus:

myproj\ 
    __init__.py 
    myproj.py 
    test\ 
     test_myproj.py 

In test_myproj.py Ich versuche, das übergeordnete Modul zu importieren wie folgt:

from .. import myproj 

Wenn ich versuche, und führen Sie es aber, ich dies:

Traceback (most recent call last): 
    File "C:\Projects\myproj\test\test_myproj.py", line 6, in <module> 
    from .. import myproj 
SystemError: Parent module '' not loaded, cannot perform relative import 

Verschiedene Quellen im Internet schlagen vor, dass dies funktionieren sollte s o Was fehlt mir?

+0

Mai verwandte Frage hat eine Antwort für Sie? http://StackOverflow.com/Questions/16981921/relative-imports-in-python-3 – jamesc

Antwort

2

Sie müssen Ihr test Verzeichnis ein Paket machen - fügen Sie __init__.py Datei zum test Verzeichnis hinzu. Danach brauchen Sie Ihre test_myproj.py Datei, um eine __name__ von myproj.test.test_myproj zu haben, wenn es ausgeführt wird, damit es den relativen Importpfad zu myproj berechnen konnte. Dies führt dazu, dass from .. import myproj als from myproj import myproj interpretiert wird. Aber wenn Sie Ihre Testdatei direkt ausführen, wird __name__ auf __main__ festgelegt, so dass der relative Import nicht berechnet werden kann. Um dies zu beheben, sollte die Testdatei importiert werden, anstatt direkt ausgeführt zu werden. Erstellen Sie eine separate Datei (z. B. testrunner.py), die Sie ausführen, um Tests durchzuführen, und importieren Sie in dieser Datei Ihre Testmodule (z. B. test_myproj.py) offensichtlich ohne relative Importsyntax, oder das Problem wird wiederholt. Der Import führt dazu, dass Ihre Testdatei mit dem Wert __name__ ausgeführt wird, sodass der relative Import berechnet werden kann. Z.B .:

hinzufügen testrunner.py wie gezeigt:

testrunner.py 
myproj\ 
    __init__.py 
    myproj.py 
    test\ 
     __init__.py 
     test_myproj.py 

testrunner.py Inhalt:

from myproj.test import test_myproj.py 

führen Sie den Test durch:

python C:\Projects\testrunner.py 

oder

cd C:\Projects\ 
python testrunner.py 

Auf diese Weise ist es wahrscheinlich am besten, ein anderes Verzeichnis hinzuzufügen, das sowohl testrunner.py als auch Ihr myproj Paket enthält.

Weitere ausführliche Erläuterungen zum relativen Import in the answer here.

Es gibt eine Notiz in official docs für diese Angelegenheit:

Hinweis, dass die relative Einfuhren auf den Namen des aktuellen Moduls basieren. Da der Name des Hauptmoduls immer "__main__" lautet, müssen Module, die als Hauptmodul einer Python-Anwendung verwendet werden sollen, immer absolute Importe verwenden.

+0

Wie setzt man "__name__' von'myproj.test.test_myproj'"? –

+0

Sie legen es nicht fest, es wird automatisch von Python gesetzt, Sie können es nur lesen.Bitte beachten Sie den Link mit Beispiel einschließlich des Codes am Ende meiner Antwort. Sie können es selbst sehen, fügen Sie einfach 'print (__ name __)' zu dem Modul hinzu, das Sie überprüfen möchten, und sehen Sie die Ausgabe, wenn Sie es ausführen und wenn Sie es importieren. – Nikita

+0

Ich habe es gelesen, aber es sieht so aus, als ob Sie sagen, die Antwort ist, dass es unmöglich ist, die Unit-Tests als Unterverzeichnis zu haben; sie müssen auf einer Ebene parallel zu myproj sitzen? –

Verwandte Themen