Legen Sie Pythonpath vor den Importanweisungen fest

70

Mein Code lautet:

import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

Da sich die scriptlib jedoch in einem anderen Verzeichnis befindet, muss ich dieses Verzeichnis in die Umgebungsvariable "PYTHONPATH" aufnehmen.

Gibt es sowieso eine Möglichkeit, in der ich zuerst das scriptlib-Verzeichnis in der Umgebungsvariablen "PYTHONPATH" hinzufügen kann, bevor die import-Anweisung wie folgt ausgeführt wird:

import sys
sys.path.append('/mypath/scriptlib')
import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

Wenn ja, ist der Wert nur für diese Eingabeaufforderung oder global?

Danke im Voraus

DKG
quelle
2
Hast Du es versucht? Dieser Code sollte einfach funktionieren. Der neue Wert von sys.pathist jedoch lokal für Ihr Programm (die $PYTHONPATHVariable wird nur beim Starten des zu füllenden Interpreters gelesen und sys.pathnicht in die Umgebung zurückgeschrieben).
Film oder

Antworten:

71

Dadurch wird Ihrem Python-Prozess / Ihrer Python-Instanz ein Pfad hinzugefügt (dh die laufende ausführbare Datei). Der Pfad wird für keine anderen Python-Prozesse geändert. Bei einem anderen laufenden Python-Programm wird der Pfad nicht geändert. Wenn Sie das Programm beenden und erneut ausführen, enthält der Pfad nicht das, was Sie zuvor hinzugefügt haben. Was Sie tun, ist im Allgemeinen richtig.

set.py:

import sys
sys.path.append("/tmp/TEST")

loop.py

import sys
import time
while True:
  print sys.path
  time.sleep(1)

Lauf: python loop.py &

Dadurch wird loop.py ausgeführt, das mit Ihrem STDOUT verbunden ist, und es wird weiterhin im Hintergrund ausgeführt. Sie können dann laufen python set.py. Jedes hat einen anderen Satz von Umgebungsvariablen. Beachten Sie, dass sich die Ausgabe von loop.pynicht ändert, da set.pysich die loop.pyUmgebung nicht ändert .

Ein Hinweis zum Importieren

Python-Importe sind wie der Rest der Sprache dynamisch. Es findet keine statische Verknüpfung statt. Der Import ist genau wie eine ausführbare Zeile sys.path.append....

Joe
quelle
aber ich möchte nicht den Pfad in meinem Code. Ich möchte, dass mein Code sauber und portabel ist. Gibt es kein Konzept für ein "Python-Projekt"? (Sprich für Visual-Studio-Code oder für Atom.io)?!
Pashute
Ja, das Äquivalent eines Python- "Projekts" ist VirtualEnv. VirtualEnvWrapper ist eine schöne Oberfläche. Der Unterschied zu Visual Studio besteht darin, dass es bereits eine globale Python-Umgebung gibt und virtualenv lediglich eine virtuelle Ebene darüber erstellt. Möglicherweise gibt es noch andere Tools. Ich bin seit einigen Jahren nicht mehr in Python.
Joe
7

Wie auch in den Dokumenten hier vermerkt .
Gehen Sie zu Python X.X/Libund fügen Sie diese Zeilen hinzu site.py.

import sys
sys.path.append("yourpathstring")

Dies ändert Ihre, sys.pathso dass bei jeder Last dieser Wert darin enthalten ist.

Wie hier über angegeben site.py,

Dieses Modul wird bei der Initialisierung automatisch importiert. Durch das Importieren dieses Moduls werden ortsspezifische Pfade an den Modul-Suchpfad angehängt und einige integrierte Funktionen hinzugefügt.

Für andere mögliche Methoden einiger Pfade Hinzufügen zu sys.pathsehen , diese Dokumente

pradyunsg
quelle
Dies entspricht jedoch dem manuellen Festlegen des Werts in Umgebungsvariablen. Was ich brauche, ist, den Pfad der Bibliothek ziemlich häufig zu ändern, z. B. den scriptlib-Pfad aus einer Datei abzurufen und festzulegen, bevor ich sie verwende.
DKG
Nein, dieser Wert wird bei jedem Durchlauf von python.exeas angehängt, der site.pybei der Initialisierung automatisch geladen wird. Sie benötigen ihn also nicht import sys sys.path.append....in jeder Datei.
Pradyunsg
1
Stellen Sie sich eine Situation vor, in der ich zwei Kopien desselben Python-Skripts habe. Ein Skript möchte eine Bibliothek von C: \ testers \ scriptlib und ein anderes von D: \ developer \ scriptlib. In diesem Fall, wie kann site.py bestimmen, welcher Pfad & wem zugewiesen wird.
DKG
@DKG Woher Pythonsoll in dieser Situation wissen, auf welche Datei Sie sich beziehen? Sie sollten einfach nicht 2 Dateien gleich
benennen
1
Ah! Die Tür öffnet sich nicht, weil das dumme Schlüsselloch falsch ist!
Miguel