Ich beschloss, die Ordner mit Python-Dateien zu organisieren, die bis jetzt ordnungsgemäß abgelegt worden waren, als das Projekt größer wurde. Das hier aufgetretene Problem war, dass ich meine eigene Bibliothek nicht importieren konnte. In Python sind nur der Ausführungsordner und die Ordner darunter der Pfad, nach dem nach Modulen gesucht werden soll, sodass Sie nicht aus Dateien über Ihnen importieren können.
Bisher habe ich sys.path.append zum Importieren aus einer übergeordneten Datei verwendet, aber es hat die folgenden Nachteile, und ich frage mich, ob es eine Möglichkeit gibt, es ohne Verwendung von sys.path.append zu lösen. tat.
Wenn ich versuche, mit sys.path.append aus einer übergeordneten Datei zu importieren, sehen die ersten Zeilen der Datei immer folgendermaßen aus:
import sys
import pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
from MyModule.MyClass import MyClass
Was ich daran hasse ist
Das ist der Punkt. Es widerspricht unweigerlich dem Ideal, sauberen Code zu schreiben.
Direnv löst diesmal ein solches Problem. direnv ist ein Tool, das Umgebungsvariablen nur dann aktiviert, wenn das Verzeichnis, in dem sich .envrc befindet, zum aktuellen Verzeichnis wird, indem Umgebungsvariablen in .envrc für jedes Verzeichnis definiert werden.
OS:macOS Catalina 10.15.6 brew 2.5.2 bash : 3.2.57(1)-release (x86_64-apple-darwin19) Python : 3.6.10
grand_mother
┣ mother
┃ ┗ me.py
┗ aunt
┗ cousin.py
Die Erklärung basiert auf der Annahme, dass "Cousin.py" importiert und in "me.py" verwendet wird.
me.py
und Cousin.py
sind wie folgt.
cousin.py
class Cousin:
name = 'Reon'
age = 14
me.py
from aunt.cousin import Cousin
print('name :', Cousin.name)
print('age :', Cousin.age)
Für Mac ein Brühbefehl.
$ brew install direnv
Wenn Sie nicht auf einem Mac sind, klonen Sie ihn mit git.
$ cd /path/to/directory #Wo Sie installieren möchten
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install
Fügen Sie einen Haken hinzu, um zu schlagen.
~/.bashrc
eval "$(direnv hook bash)"
Laden Sie ~ / .bashrc neu, damit direnv funktioniert.
$ source ~/.bashrc
Gehen Sie zum Anfang des Projekts, in dem Sie die Umgebungsvariablen festlegen möchten (in diesem Fall grand_mother /), und führen Sie den folgenden Befehl aus:
$ cd 〇〇/grand_mother
$ direnv edit .
Dann wird grand_mother / .envrc erstellt, also füge PYTHONPATH hinzu.
grand_mother/.envrc
export PYTHONPATH="〇〇/grand_mother:$PYTHONPATH"
Jetzt können Sie Dinge wie "vom Mutterimport" und "vom Tantenimport" in den Dateien in "Großmutter" ausführen.
PYTHONPATH fügt ein Verzeichnis hinzu, in dem zusätzlich zu den Standard-Python-Modulen nach Modulen gesucht wird, wenn Python die Module lädt. Sie können den aktuell eingestellten PYTHONPATH mit dem folgenden Befehl überprüfen.
#Überprüfen Sie den PYTHON-WEG
$ echo $PYTHONPATH
#Alle Umgebungsvariablen einschließlich PYTHON anzeigen
$ printenv | grep PYTHON
Wenn Sie alle Verzeichnisse anzeigen möchten, die Python beim Laden eines Moduls lädt, können Sie dies auch im sys.path von Python überprüfen.
import sys
print(sys.path)
Anhand dieses Artikels werde ich auch erklären, wie Umgebungsvariablen in Richtung "Großmutter / .env" geschrieben werden. Ich habe diese Methode gewählt, weil ich bereits andere Umgebungsvariablen in .env geschrieben habe.
Das war's für .envrc.
grand_mother/.envrc
dotenv
Fügen wir den folgenden Satz zu .env hinzu.
grand_mother/.env
PYTHONPATH=/〇〇/grand_mother/
Nach dem Einstellen von .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
Möglicherweise wird eine solche Fehleranweisung angezeigt. Führen Sie zu diesem Zeitpunkt "direnv allow" aus, wie in der Fehleranweisung gezeigt, und bestätigen Sie, dass PYTHONPATH hinzugefügt wurde. Dieser Satz wird jedes Mal angezeigt, wenn Sie .envrc neu schreiben.
$ direnv allow
direnv: loading ~/〇〇/grand_mother/.envrc
direnv: export +PYTHONPATH
Wenn Sie das Verzeichnis verlassen, in dem sich .envrc befindet, wird direnv vorübergehend deaktiviert.
$ cd ..
direnv: unloading
Wenn Sie erneut das Verzeichnis eingeben, in dem sich .envrc befindet, sehen Sie, dass der Inhalt von .envrc zu den Umgebungsvariablen hinzugefügt wurde.
$ cd grand_mother/
direnv: loading .envrc
Jetzt funktioniert me.py gut.
$ python mother/me.py
name : Reon
age : 14
Beim Teilen von Quellcode auf GitHub usw. enthalten .env und .envrc Informationen, die gestohlen werden sollten. Abhängig von der Ausführungsumgebung müssen Sie möglicherweise unterschiedliche Werte festlegen. Legen Sie daher keine Festschreibung für das Repository fest, indem Sie .envrc zu .gitignore hinzufügen.
Dieses Mal musste ich direnv in Amazon Linux einfügen, das ich gemäß meinem lokalen Betriebssystem betrieb, damit ich zu diesem Zeitpunkt auch den Arbeitsinhalt aufschreiben kann.
$ cat /etc/os-release
Amazon Linux AMI 2018.03
$ bash --version
GNU bash,Version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Erstens enthält Amazon Linux kein Go-to-Run-Verzeichnis, daher müssen Sie es installieren.
$ sudo yum install golang -y
Dann git clone und installiere direnv wie oben in diesem Artikel gezeigt.
$ cd /path/to/directory #Wo Sie installieren möchten
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install
Fügen Sie GOPATH- und Direnv-Hooks zu Bash hinzu. GOPATH gibt den Standort für das Gebäude an, sodass Sie einen beliebigen Standort verwenden können.
~/.bashrc
export GOPATH=$HOME/go
eval "$(direnv hook bash)"
Laden wir ~ / .bashrc neu und überprüfen Sie das Einstellungsergebnis.
$ source ~/.bashrc
$ echo $GOPATH
/home/ec2-user/go
Danach können Sie direnv jetzt unter Amazon Linux verwenden, indem Sie die oben im Artikel beschriebene Methode ** direnv aktivieren ** befolgen.
Recommended Posts