[LINUX] Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten

Das Problem, das Sie in diesem Artikel lösen möchten

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.

Schwächen von sys.path.append

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.

Meine Entwicklungsumgebung

OS:macOS Catalina 10.15.6 brew 2.5.2 bash : 3.2.57(1)-release (x86_64-apple-darwin19) Python : 3.6.10

In dieser Erklärung verwendete Ordnerstruktur

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)

Installieren Sie direnv

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

Direnv zur Verfügung stellen

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.

Was ist PYTHONPATH?

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)

(Nur für diejenigen, die es benötigen) Wenn Sie Umgebungsvariablen in .env schreiben möchten

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/

Überprüfen Sie die Funktion von direnv

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

gelöst

Jetzt funktioniert me.py gut.

$ python mother/me.py
name : Reon
age : 14

Betrieb von .envrc

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.

(Ergänzung) Führen Sie direnv in Amazon Linux ein

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.

Amazon Linux-Umgebung

$ 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.

Referenzartikel

Recommended Posts

Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte mit Python in eine Datei schreiben
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte einen Quantencomputer mit Python betreiben
[Python] Ich möchte mit Flask ein statisches Verzeichnis hinzufügen. [Ich möchte etwas anderes als statisch verwenden.]
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte mit Python debuggen
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich habe versucht, eine Mac Python-Entwicklungsumgebung mit pythonz + direnv zu erstellen
Ich möchte MATLAB feval mit Python verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
Ich möchte Ceres Solver aus Python verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit Python-Datenklasse nach hinten erben
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
Ich möchte eine Zeichenkette mit Hiragana teilen
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte manuell eine Legende mit matplotlib erstellen
Für diejenigen, die Python mit vim schreiben möchten
Ich möchte eine lokale Variable mit Lambda binden
Eine echte Möglichkeit für Benutzer von Python 3.8.0-2 aus Windows, mit Multi-Byte-Zeichen zu arbeiten
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird
Erstellen Sie ein Verzeichnis mit Python
Ich möchte Pythons ungelöste Importwarnung mit vsCode entfernen
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
[Python] Ich möchte einen gemeinsamen Satz zwischen numpy erhalten
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte Daten mit Python analysieren können (Teil 4)