2016-06-14 8 views
0

Ich habe ein Python-Projekt, in dem ich eine C++ Klasse verwenden möchte, die ich über Cython verfügbar gemacht habe (wirklich, ich brauche nur eine bestimmte Instanz der Klasse, wie der folgende Code demonstriert). Da es eine Reihe von Dateien gab, die mit der Klasse verbunden waren, entschied ich mich, sie in ein eigenes Paket zu schreiben.Cython exposed-Klasse aus einem anderen Verzeichnis importieren

In der __init__.py Datei dieses Pakets habe ich was zu dem folgenden Code beträgt:

from foo import Foo # import the class 

bar = Foo(some_parameters) 
__all__ = ["bar"] 

Das funktioniert gut, wenn ich __init__.py von selbst laufen. Allerdings, wenn ich versuche, darauf zuzugreifen von außerhalb des Verzeichnisses:

from qux import bar # inside main.py in the parent directory 

bekomme ich den Fehler an die gleichen zurückverfolgt __init__.py:

File "D:\path\to\qux\\__init__.py", line 2, in <module> 
from foo import Foo 
ImportError: No module named 'foo' 

Daran erinnern, dass foo ist eine Cython Datei, nicht rein Python-Code.

Die Verzeichnisstruktur sieht wie folgt aus:

main_project\ 
    main.py 
    (more supporting files here) 
    qux\ 
    __init__.py 
    cy_foo.cpp 
    cy_foo.pyx 
    foo.cpp 
    foo.h 
    foo.cp35-win_amd64.pyd 
    (more supporting files here) 

Was ist los?

Antwort

1

ich das nicht denke, hat nichts mit Cython zu tun per se, sondern diese Frage ist aufgrund der Tatsache, dass, wenn Sie main.py in der obersten Ebene auszuführen, Python__init__.py ausgeführt wird und im gleichen Verzeichnis suchen andernfalls um das foo Modul innerhalb qux zu lokalisieren.

Als Lösung der import Anweisung ändern in __init__.py zu:

from qux.foo import Foo 

Sie noch aus irgendeinem Grund Wenn brauchen __init__.py als __main__ Skript ausgeführt werden soll, können Sie die ach so vertrauten if Klausel die überprüfen __name__:

if __name__ == "__main__": 
    from foo import Foo 
else: 
    from qux.foo import Foo 

bar = Foo("arguments") 
__all__ = ["bar"] 

wenn nun als Modul __main__ ausführen, wird __init__.pyfinden 210, wenn nicht, erlaubt es anderen, es zu finden.

+0

Das hat es behoben! Ich glaube, ich habe versucht, etwas wie "Import scipy" zu machen; von Optimize Import Brentq ohne Qualifizierung 'Optimize' als' Scipy'. Es kam mir einfach nicht in den Sinn, dass Python immer noch im obersten Verzeichnis suchen würde, während er ein Skript in einem Unterverzeichnis ausführte. –

Verwandte Themen