Ich habe eine Python-Anwendung mit der folgenden Verzeichnisstruktur:
src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib
Im Paket main habe ich ein Python-Modul namens MyServer.py, das eine import-Anweisung wie folgt enthält :
from gen_py.lib import MyService
Damit diese Anweisung funktioniert, habe ich die folgende Zeile am Anfang von MyServer.py platziert :
import sys
sys.path.append('../gen_py/lib')
Wenn ich MyServer.py im Terminal ausführe, wird folgende Fehlermeldung angezeigt:
ImportError: Kein Modul mit dem Namen gen_py.lib
Was fehlt mir hier?
Antworten:
Bei Ihrer Änderung von wird
sys.path
davon ausgegangen, dass sich das aktuelle Arbeitsverzeichnis immer in befindetmain/
. Das ist nicht der Fall. Fügen Sie stattdessen einfach das übergeordnete Verzeichnis hinzu zusys.path
:import sys import os.path sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import gen_py.lib
Vergessen Sie nicht, eine Datei
__init__.py
in gen_py und lib aufzunehmen - andernfalls werden sie nicht als Python-Module erkannt.quelle
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
auf? Warum ist es nichtsys.path.append(os.path.join('..', os.path.dirname(__file__)))
?Damit der Import des Python-Moduls funktioniert, muss "src" in Ihrem Pfad sein, nicht "gen_py / lib".
Bei der Verarbeitung eines Imports wie
import gen_py.lib
sucht es nach einem Modulgen_py
und dann nach einem Submodullib
.Da sich das Modul
gen_py
nicht in "../gen_py/lib" befindet (es befindet sich in ".."), trägt der von Ihnen hinzugefügte Pfad nicht zum Importvorgang bei.Versuchen Sie, je nachdem, von wo aus Sie es ausführen, den relativen Pfad zum Ordner "src" hinzuzufügen. Vielleicht ist es das
sys.path.append('..')
. Möglicherweise haben Sie auch Erfolg, wenn Sie das Skript direkt im Ordner src über relative Pfade wie ausführenpython main/MyServer.py
quelle
from ..gen_py.lib import MyService
oder
from main.gen_py.lib import MyService
Stellen Sie sicher, dass Sie
__init__.py
in jedem Verzeichnis eine (mindestens leere) Datei haben.quelle
__init__.py
Stellen Sie sicher , dass Python enthalten ist , damit Python weiß, dass diese Verzeichnisse Pakete enthaltenquelle
Dies ist der Fall, wenn Sie ein Paket erstellen und beim Import einen Fehler feststellen. Ich habe es auf die harte Tour gelernt. Die Antwort ist nicht, das Paket zum Python-Pfad hinzuzufügen oder es programmgesteuert zu machen (was ist, wenn Ihr Modul installiert wird und Ihr Befehl es erneut hinzufügt?), Das ist ein schlechter Weg.
Das Richtige ist: 1) Verwenden Sie virtualenv pyvenv-3.4 oder ähnliches. 2) Aktivieren Sie den Entwicklungsmodus - $ python setup.py Develop
quelle
Stellen Sie sicher, dass das Stammprojektverzeichnis in der Ausgabe von sys.path angezeigt wird. Wenn nicht, fügen Sie bitte den Pfad des Stammprojektverzeichnisses zu sys.path hinzu.
quelle