2017-09-12 6 views
0

Ich habe hauptsächlich an PHP gearbeitet, wo es wirklich einfach war, Klassen speziell nach dem Komponisten zu importieren. Aber ich habe Schwierigkeiten, die gleiche Verzeichnisstruktur im Python-Projekt anzuwenden.Importieren von Projektdateien in Python

Ich habe die folgende Verzeichnisstruktur.

backend commands indices.py backup.py etc.py components mapping product.py storage Es.py interfaces StorageInterface.py IndexInterface.py

Meine Befehle Ordner sind im Grunde die Dateien, die ich durch cli ausgeführt werden, wo als die Komponenten werden die tatsächliche Geschäftslogik und Schnittstellen nur enthalten die ABCs für Komponenten halten.

Ich habe mehrere Imports im ganzen Code manchmal aus dem gleichen Ordner manchmal aus Unterordner und manchmal gleiche Ebene einen anderen Ordner zu tun.

Zum Beispiel in meiner indices.py Datei habe ich diesen Import

from components.storage.Es import Es 

Das ist mir

[email protected]:/backend/commands# python indices.py --help 
Traceback (most recent call last): 
File "indices.py", line 1, in <module> from components.storage.Es import Es ImportError: No module named components.storage.Es 

gibt ich habe auf SO durch andere Antworten gegangen und fand wirklich schmutzig Lösungen von sys setzen und os Module und Hinzufügen von Dateien zur Laufzeit. Dies könnte in Ordnung sein, wenn seine 1 2 Dateien aber das gesamte Projekt verwalten, sieht wirklich schlecht aus.

Meine Frage lautet hier

1 - verfolge ich die pythonic Weg, um ein Projekt 2 der Verwaltung - Wie kann ich meine alle Dateien Klassen zugreifen in einer ordentlichen Weise

Dank

+0

Für den negativen Marker. Es ist mir egal, solange ich etwas lernen kann. –

Antwort

1

Behandeln Sie Ihren gesamten backend Ordner wie ein Paket. Wenn Sie Legacy Python (Python 2) verwenden, müssen Sie __init__.py Dateien in allen Ordnern ablegen, damit sie als Unterpakete importiert werden können. Sie müssten entweder Ihre Importe optimieren, um dann from backend.components.storage.Es oder from ..components.storage.Es (relative Importe) zu sein.

Dann, weil es alles ein Paket ist, werden Sie feststellen, dass Sie nicht in einen Unterordner gehen und Code ausführen können. Die Lösung besteht dann darin, den Code (z. B. backend/commands/backup.py) unter Verwendung des -m Modul-Flags: python -m backend.commands.backup aus dem Ordner auszuführen, der backend enthält.Wenn Sie möchten, können Sie später einen Eingangspunkt hinzufügen, indem Sie eine setup.py machen, die es in einen schöneren Befehl verwandeln würde.

+0

Ich habe einen '' 'src'''-Ordner im' '' Backend''-Ordner erstellt und '' '__init __. Py''' in allen meinen Modulen hinzugefügt. Jetzt kann ich meine Befehle vom Backend-Ordner wie '' 'python -m src.commands.indices''' ausführen. So weit, ist es gut. Wollte nur sicher sein, dass dies der Industriestandard für den Umgang mit Python-CLI-Projekten ist? –

1

Sie benötigen __init__.py Dateien in den commands, components, mapping, storage und interfaces Unterverzeichnisse, damit diese Verzeichnisse und die darin enthaltenen Dateien von Python als Module betrachtet werden. Auch haben einzelne Module, die den gleichen Namen wie eine Klasse haben, die in ihnen definiert ist, nicht wirklich pythonisch. Zum Beispiel ist es besser, ein interfaces Modul zu haben, das durch eine interfaces.py Datei definiert wird, die beide Interface-Klassen enthält, als zwei Dateien mit den Namen StorageInterface.py und IndexInterface.py, die jeweils eine Klassendefinition enthalten (ich gehe davon aus, dass Sie das dort tun).

Es ist auch wichtig, in welchem ​​Verzeichnis Sie den Python-Prozess starten. Damit dieser Importpfad sinnvoll ist, bin ich mir ziemlich sicher, dass Sie den Python-Prozess innerhalb des Verzeichnisses backend starten müssen. Oder Sie müssen die Dateisystempfade der Unterverzeichnisse components, commands usw. zum Python-Modulpfad über die PYTHONPATH env var oder auf andere Weise hinzufügen.