meine Verzeichnisstruktur Dies ist importiert werden:Wie kann ich eine Python Projektstruktur namens Module zu ermöglichen, von Unterverzeichnissen
Projects
+ Project_1
+ Project_2
- Project_3
- Lib1
__init__.py # empty
moduleA.py
- Tests
__init__.py # empty
foo_tests.py
bar_tests.py
setpath.py
__init__.py # empty
foo.py
bar.py
Ziele:
- eine organisierte Projektstruktur haben
- Be in der Lage, jede .py-Datei bei Bedarf unabhängig auszuführen
- Sie können beide Geschwister und Cousins Module beziehen/importieren
- Halten Sie alle Import/from-Anweisungen am Anfang jeder Datei.
I Erreicht # 1 durch die obige Struktur mit
ich meistens 2 erreicht haben, 3 und 4 durch folgende Maßnahmen (wie von this excellent guide empfohlen)
In jedem Paket, das benötigt Zugang Eltern oder Cousin Module (wie die Tests Verzeichnis oben) enthalten ich eine Datei setpath.py genannt, die den folgenden Code hat:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('...'))
in jedem Modul dann die Eltern/Cousin Zugriff benötigt,
import setpath # Annoyingly, PyCharm warns me that this is an unused import statement
import foo.py
Innen setpath.py, die zweite und dritte Einsätze sind nicht unbedingt notwendig, für dieses Beispiel, sondern als Schritt zur Fehlerbehebung enthalten: wie foo_tests.py, kann ich eine schöne, saubere Liste der Importe wie so schreiben .
Mein Problem ist, dass dies nur für Importe funktioniert, die den Modulnamen direkt referenzieren, und nicht für Importe, die das Paket referenzieren. Innerhalb von bar_tests.py funktioniert beispielsweise keine der beiden folgenden Anweisungen, wenn bar_tests.py direkt ausgeführt wird.
import setpath
import Project_3.foo.py # Error
from Project_3 import foo # Error
erhalte ich die Fehlermeldung "Import: Kein Modul mit dem Namen 'Project_3'".
Was ist seltsam ist, dass ich die Datei direkt aus PyCharm ausführen kann und es funktioniert gut. Ich weiß, dass PyCharm mit der Variable Python Path
etwas hinter den Kulissen zaubert, damit alles funktioniert, aber ich kann nicht herausfinden, was es ist. Da PyCharm einfach python.exe ausführt und einige Umgebungsvariablen einstellt, sollte es möglich sein, dieses Verhalten innerhalb eines Python-Skripts selbst zu klonen.
Aus Gründen, die für diese Frage nicht relevant sind, muss ich unter Verwendung des Project_3
Qualifiers auf bar
verweisen.
Ich bin offen für jede Lösung, die die oben genannten erfüllt und gleichzeitig meine früheren Ziele erfüllt. Ich bin auch offen für eine alternative Verzeichnisstruktur, wenn es eine gibt, die besser funktioniert. Ich habe die Python doc on imports und Pakete gelesen, bin aber immer noch ratlos. Ich denke, ein möglicher Weg könnte sein, die Variable __path__
manuell zu setzen, aber ich bin mir nicht sicher, welche geändert werden muss oder wie sie eingestellt werden soll.
Obwohl ich stimme völlig @Blckknght Antwort (und bevor er veröffentlicht, fing sogar an, ähnlich im gleichen Ton zu schreiben). Es ist vielleicht erwähnenswert, dass, wenn es sich nicht um einen anderen Tippfehler handelt, Ihr aktuelles Modell aufgrund von sys.path.insert (0, os.path.abspath ('...')) möglicherweise nicht funktioniert, da '...' kein a ist Gültiger übergeordneter Pfadwähler Hier sollten Sie die normale '../ ..' Dateisystem-Notation verwenden, nicht Pythons Eltern-Module. – RobertT
@RobertT Unglaublich!So einfach, aber es behebt das Problem und es scheint, dass dies mir erlaubt, relative Wurzeln sowohl für Pakete als auch für Module zu setzen. Ich denke immer noch, dass etwas robusteres mit den Import-Bibliotheken implementiert werden könnte, aber dies beantwortet meine Frage und erreicht die oben genannten Ziele. Mache es bitte zur Antwort, und ich werde es für den Kopfgeldpreis berücksichtigen. – BrianHVB