2015-12-14 14 views
5

Ich möchte für mein Projekt diese Struktur haben:Python Importe Struktur

requirements.txt 
README.md 
.gitignore 
project/ 
    __init__.py 
    project.py 
    core/ 
     __init__.py 
     base.py 
    engines/ 
     __init__.py 
     engine1.py 
     engine2.py 
    utils/ 
     __init__.py 
     refine_data.py 
     whatever.py 

Die Anwendung wird von project/project.py laufen. Ich bekomme jedoch ständig Importfehler, wenn ich relative oder absolute Importe verwende.

Beiden Motoren müssen von project.core.base importieren, die utils von project.core.base als auch importieren müssen, und project.py (die Hauptdatei RAN) muss in der Lage sein, von engines zu importieren.

Absolute Importe nicht funktionieren:

# engines/engine1.py 
from project.core.base import MyBaseClass 

, die den Fehler verursacht:

ImportError: No module named project.core.base 

Aber wenn ich einen relativen Import stattdessen versuchen

# engines/engine1.py 
from ..core.base import MyBaseClass 

ich:

ValueError: Attempted relative import beyond toplevel package 

Ich habe andere Projekte auf Github ähnlich gesehen, aber das scheint alle möglichen Probleme zu verursachen. Wie bekomme ich das zum Laufen?

+1

Geschwisterpakete sollten in der Lage sein, nur voneinander zu importieren. So können Motoren einfach Kern importieren. – pvg

Antwort

2

versuchen, diese Importe zu verwenden:

engine1.py:

from core import base 

refine_data.py:

from core import base 

project.py

from engines import engine1 

Wenn Sie pycharm mark Projekt Verzeichnis als Quellen root verwenden und dann versuchen, project.py auszuführen. Wenn Sie Sie, indem Sie auf Projekt laufen project.py Verzeichnis und laufenden Befehl nicht PyCharm verwenden können:

python project.py 
4

Werfen Sie einen Blick auf Ihre sys.path. Es ist wahrscheinlich, dass das oberste Verzeichnis project im Python-Pfad ist, und es sieht Ihre Unterpakete (dh. utils, engines, etc.) als separate Pakete, weshalb es Ihnen einen Fehler gibt, aus dem Sie versuchen zu importieren außerhalb des Pakets, wenn relative Importe ausgeführt werden, und absolute Importe funktionieren nicht, da das oberste Projektverzeichnis nicht gefunden werden kann, da es sich nicht unter einem der Python-Pfade befindet.

Das Verzeichnis über Das oberste Projektverzeichnis muss dem Python-Pfad hinzugefügt werden.

Ex.

/path/is/here/project/core/... 

# Add this to the PYTHONPATH 
/path/is/here 
+0

Sollte ich einfach eine 'sys.path.append()' innerhalb des Skripts selbst tun? –

+0

Sie können das sicherlich tun. Soll Ihr Paket verteilt und installiert werden?Wenn ja, sollten Sie in die Erstellung eines 'setup.py'-Skripts für Ihr Paket schauen und es installieren, welches sicherstellt, dass es in dem Pythonpfad liegt. –

+0

Ich versuche gerade,' project/project.py' von der Kommandozeile aus auszuführen. Aber ich werde sicher ein 'setup.py' machen, wenn ich es verteile (ich muss Google wie, ich weiß nicht, wie es geht). –