Relatives Importieren eines Python-Moduls aus einem Unterordner eines anderen Unterordners

8

Ich versuche, Alembic zu verwenden, der ein sqlalchemy Werkzeug in Python ist. Sie geben einen Befehl ein und es erzeugt einen Ordner "Alembic" mit Py-Dateien. Die Py-Datei innerhalb, muss mit meiner Anwendung in einem separaten Ordner namens "myapp" verlinken. Aber ich kann es nicht verbinden. Es besagt, dass es nicht existiert und der relative Import funktioniert nicht.

Ich muss also meine Konfigurationsklasse aus der Datei myapp / configs / config.py importieren.

%Vor%

in env.py:

%Vor%

Funktioniert nicht.

Ich habe es versucht:

%Vor%

Kein Erfolg.

Beispielcode in Alembic-Dokumenten sagen Sie einfach "myapp.whatever".

Ich habe sogar "/ apps" und "/ myapp" zu PYTHON_PATH in Umgebungsvariablen hinzugefügt.

Beispielfehler:

%Vor%     
Dexter 04.02.2013, 07:53
quelle

2 Antworten

9

Sie haben zwei mögliche Lösungen für Ihr Problem:

Ändern Sie Ihre PYTHONPATH-Umgebungsvariable

Fügen Sie den Pfad zum apps-Katalog hinzu, indem Sie die folgenden BASH / SH-Shell-Befehle in Ihrem Terminal ausführen:

%Vor%

Bitte beachten Sie, dass das Hinzufügen zur Umgebungsvariablen PATH nicht funktioniert. Um mehr über PYTHONPATH zu erfahren, wie man es verwaltet, sowie nette und freundliche Informationen über Module im Allgemeinen:

Ссылка

Bitte beachten Sie jedoch, dass dieser Ansatz den PYTHONPATH Ihres Systems beeinflusst. Es wird dringend empfohlen, ein virtualenv zu verwenden - nur für den Fall, dass etwas schief geht, wird es nicht alle Ihre System und andere Apps beeinflussen. Bei Verwendung von virtualenvwrapper:

%Vor%

Weitere HIER .

Pfad innerhalb des Python-Skripts anfügen

Alternativ können Sie dasselbe tun, aber nur für eine Skriptlaufzeit, indem Sie Folgendes hinzufügen:

%Vor%

zu Ihrer apps/alembic/env.py -Datei.

Nehmen Sie schließlich in derselben Datei folgende Änderungen vor:

%Vor%

Und bitte beachten Sie, dass Ihr apps/myapp Ordner auch __init__.py Datei (möglicherweise leer) enthalten sollte, damit Python als Modul behandelt wird, wie Demian Brecht darauf hingewiesen hat.

    
CloudRide 13.05.2013, 16:27
quelle
0

Ist myapp eine in sich geschlossene Anwendung oder eine Unteranwendung wie die, die Sie mit Django finden können? Wenn es eine in sich geschlossene App ist, dann gehst du etwas falsch. Was Sie wirklich tun möchten, ist, die Abhängigkeiten zu installieren, die Ihre App hat, um auf sie zugreifen zu können, ohne relative Imports und Ähnliches verwenden zu müssen (was eine schlechte Übung ist, besonders wenn jemand außer Ihnen benutzt die App).

Was Sie wahrscheinlich tun möchten (auch wenn es in sich abgeschlossen ist):

  • Richten Sie eine virtuelle Umgebung für Ihre App ein (ich highly empfehle die Verwendung von virtualenvwrapper, über die ich gerade in meinem glänzenden neuen (und unvollständigen) Blog geschrieben habe: Ссылка
  • Installieren Sie alembic als Abhängigkeit: pip install alembic
  • Erstellen Sie eine requirements.txt -Datei: pip freeze > requirements.txt

Nun sollten Sie in der Lage sein, Alambic via import alembic von überall in Ihrem Projekt zu verwenden.

Bearbeiten :

Ihre Verzeichnisstruktur ist auch ein wenig wackelig. Sie möchten alle Ihre appspezifischen Module in ein anderes myapp -Unterverzeichnis einfügen:

%Vor%

Der Grund dafür ist, dass du myapp zu deinem PYTHONPATH hinzufügen kannst und alle Module aus deiner App über from myapp import foo importieren kannst. So wie es steht, wenn myapp auf Ihrem PYTHONPATH steht, können Sie nur auf die Submodule aus der zweiten Namespace-Ebene (d. H.% Co_de%) zugreifen, was aus offensichtlichen Gründen schlecht ist.

    
Demian Brecht 04.02.2013 08:01
quelle