PYTHONPATH dauerhaft ein Verzeichnis hinzufügen?

323

Bei jeder Verwendung sys.path.appendwird das neue Verzeichnis hinzugefügt. Sobald ich Python schließe, wird die Liste jedoch auf die vorherigen (Standard?) Werte zurückgesetzt. Wie füge ich ein Verzeichnis dauerhaft hinzu PYTHONPATH?

John Howard
quelle

Antworten:

134

Sie müssen Ihr neues Verzeichnis zur Umgebungsvariablen hinzufügen PYTHONPATH, die durch einen Doppelpunkt vom vorherigen Inhalt getrennt ist. In jeder Form von Unix können Sie dies in einem Startskript tun, das für die von Ihnen verwendete Shell ( .profileoder was auch immer, abhängig von Ihrer bevorzugten Shell) geeignet ist, mit einem Befehl, der wiederum von der betreffenden Shell abhängt. Unter Windows können Sie dies zu diesem Zweck über die System-GUI tun.

superuser.com Möglicherweise ist dies ein besserer Ort, um weitere Fragen zu stellen, dh um weitere Einzelheiten zu erfahren, wenn Sie Einzelheiten zur Anreicherung einer Umgebungsvariablen in der von Ihnen ausgewählten Plattform und Shell benötigen, da dies an sich keine eigentliche Programmierfrage ist.

Alex Martelli
quelle
8
Errata: Trennzeichen unter Windows wäre ein Semikolon. Wenn Sie Systempfade in Windows überschreiben müssen, ist die Einstellung über die GUI als Benutzerumgebungsvariable möglicherweise nicht ausreichend, da Benutzervariablen an Systemvariablen angehängt werden. In diesen Fällen müssen Sie auf ein Startskript zurückgreifen, das die erforderlichen Anpassungen vornimmt.
Nathan Ernst
1
@Nathan, tx für die Erinnerung an Semikolon, aber (wenn Sie ein Admin natürlich sind) Sie können einstellen System env.vars auf Fenster (plus wird die OP nicht zu fragen , wie zu überschreiben , den Pfad, wie nur anhängen , um es Daher ist auch ein Benutzer env.var dafür in Ordnung! -).
Alex Martelli
Leider bin ich kein Administrator auf meinem Arbeits-PC, daher muss ich auf solche Maßnahmen zurückgreifen. :(
Nathan Ernst
438

Wenn Sie bash verwenden (auf einem Mac oder einer GNU / Linux-Distribution), fügen Sie dies Ihrem hinzu ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
quelle
28
Dies hat bei mir perfekt funktioniert, aber stellen Sie sicher, dass das Verzeichnis, auf das Sie verweisen, die oberste init .py-Datei in Ihrer Verzeichnisstruktur hat. Das war mir zunächst nicht ganz klar. Ich habe beispielsweise versucht, PYTHONPATH = $ PYTHONPATH: / Users / joey / repos zu exportieren, aber es hat nicht funktioniert, da mein Repos-Verzeichnis nicht _ init_ .py hatte. Ein Verzeichnis weiter gehen: / Users / joey / repos / spezifischRepo hat den Trick gemacht. Jetzt kann Python jedes nach unten gerichtete Verzeichnis durchlaufen, das mit dem spezifischen Repository- Verzeichnis verbunden ist, das eine init .py enthält !
Qiao Yi
3
Das hat bei mir funktioniert, aber können Sie erklären, wo sich diese PYTHONPATH-Variable befindet? und woher weiß "PYTHONPATH exportieren", um genau diese Datei zu finden?
AppleLover
42
Denken Sie daran, nachdem Sie bearbeitet und ~/.bashrcdann ausgeführt haben, source ~/.bashrcsiehe stackoverflow.com/questions/2518127/…
b_dev
1
Ich denke, es ist eine schlechte Idee, sudo suam Anfang Ihrer .bashrc-Datei zu setzen. Dieser Beitrag stimmt mit mir überein. Zumindest auf meinem System ist es nicht einmal notwendig.
LondonRob
Das ist die Antwort.
Aerin
88

Anstatt zu manipulieren PYTHONPATH, können Sie auch eine Pfadkonfigurationsdatei erstellen . Finden Sie zuerst heraus, in welchem ​​Verzeichnis Python nach diesen Informationen sucht:

python -m site --user-site

Aus irgendeinem Grund scheint dies in Python 2.7 nicht zu funktionieren. Dort können Sie verwenden:

python -c 'import site; site._script()' --user-site

Erstellen Sie dann .pthin diesem Verzeichnis eine Datei mit dem Pfad, den Sie hinzufügen möchten (erstellen Sie das Verzeichnis, falls es nicht vorhanden ist).

Zum Beispiel:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
etw
quelle
Ich habe dies mit Python 2.6 versucht und es scheint nicht für mich zu funktionieren
Lorcan O'Neill
4
Ich habe dieses Verzeichnis gerade mit meinem eigenen Bibliotheksverzeichnis verknüpft und alle meine Skripte dort gespeichert. Hat gut funktioniert.
Feuer vom
Es wurde beschlossen, es erneut zu versuchen, nachdem dieses Thema erneut gefunden wurde, und es gelang, es wie oben beschrieben zum Laufen zu bringen! Upvoted und zerknirschte Entschuldigungen :)
Lorcan O'Neill
Das funktioniert einfach perfekt, ich war auf dem richtigen Weg, aber die python -m site --user-siteund (create the directory if it doesn't exist)Teile waren das, was mir fehlte, um es zum Laufen zu bringen.
Aurélien Ooms
1
Muss ich einen zusätzlichen Schritt ausführen, damit Python den hinzugefügten Pfad zu erkennt somelib.pth? Wenn nicht, raten Sie mal, warum dies möglicherweise nicht funktioniert?
Miladiouss
38

Dies funktioniert unter Windows

  1. Gehen Sie unter Windows mit Python 2.7 zum Python-Setup-Ordner.
  2. Öffnen Sie Lib / Site-Pakete.
  3. Fügen Sie diesem Ordner eine leere Datei example.pth hinzu.
  4. Fügen Sie der Datei den erforderlichen Pfad hinzu, einen pro Zeile.

Dann können Sie alle Module in diesen Pfaden aus Ihren Skripten sehen.

auserdude
quelle
3
IMO, dies ist die beste Lösung, da dies nicht von der Wahl der Shell oder der Arbeitsumgebung abhängt. Funktioniert auch unter Linux, wo der Standard-Python-Pfad "/usr/local/lib/pythonX.Y/site-packages" lautet. Wenn dies nicht funktioniert, versuchen Sie stattdessen, Ihre .pth-Datei in das Verzeichnis dist-packages zu legen.
Matus
1
Windows 7, Python 3.6.5. Das ist die Antwort. Wie auserdude schrieb: Erstellen Sie die "example.pth" in Pythons Lib / site-packages-Ordner und fügen Sie dann Ihren Pfad wie folgt hinzu: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123
Hervorragende Antwort, funktioniert auch mit Python 3.7 unter Windows 10, mein Windows 10-Pfad lautet: "C: \ Users \ {usrName} \ AppData \ Local \ Programme \ Python \ Python37-32 \ Lib"
Ali80
Kann bestätigen, dass es für Python 3.6.7 unter Windows 10 funktioniert. Beachten Sie jedoch, dass der Pfad an Ihren PYTHONPATH angehängt wird, sodass Ihr angehängtes Modul bei einer Namenskollision nicht gefunden wird.
BramAppel
24

Falls noch jemand verwirrt ist - wenn Sie einen Mac verwenden, gehen Sie wie folgt vor:

  1. Terminal öffnen
  2. Art open .bash_profile
  3. Fügen Sie in der angezeigten Textdatei diese Zeile am Ende hinzu: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Speichern Sie die Datei, starten Sie das Terminal neu und fertig
entrepaul
quelle
1
Wer sich fragt, wie man den Pfad der Python sieht, benutzt: welche Python
Arindam Roychowdhury
Ich bin mir ziemlich sicher, dass Sie das Terminal auch neu laden müssen
Benutzer
Eigentlich war der exportSchlüssel das, was mir gefehlt hat !!!!, positiv bewertet, vielen Dank!
a_m_dev
21

Sie können den Pfad über Ihre pythonrc-Datei hinzufügen, die unter Linux standardmäßig ~ / .pythonrc ist. dh.

import sys
sys.path.append('/path/to/dir')

Sie können die PYTHONPATHUmgebungsvariable auch in einer globalen RC-Datei festlegen , z. B. ~/.profileunter Mac oder Linux, oder über Systemsteuerung -> System -> Registerkarte Erweitert -> Umgebungsvariablen unter Windows.

Blue Peppers
quelle
40
sys.path.append ('/ path / to / dir') fügt den Eintrag nicht dauerhaft hinzu.
Jeremyjjbrown
15

Um ein bisschen mehr Erklärung zu geben, Python automatisch seine Suchpfade konstruieren (wie erwähnt oben und hier ) mit dem site.pySkript ( in der Regel in sys.prefix gelegen + lib/python<version>/site-packagessowie lib/site-python). Man kann den Wert von sys.prefix erhalten:

python -c 'import sys; print(sys.prefix)'

Das site.py Skript fügt dann eine Reihe von Verzeichnissen, abhängig von der Plattform, wie zum Beispiel /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesum den Suchpfad und auch sucht diese Pfade für <package>.pthDateien Config , die bestimmte zusätzliche Suchpfade enthalten. Zum Beispiel verwaltet easy-install seine Sammlung installierter Pakete, die einer systemspezifischen Datei hinzugefügt werden, z. B. unter Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. Auf einem typischen System gibt es eine Reihe dieser .pth-Dateien, um die herum einige unerwartete Pfade in sys.path erklärt werden können:

python -c 'import sys; print(sys.path)'

So kann man eine .pth - Datei erstellen und in jedem dieser Verzeichnisse (einschließlich der sitedir wie erwähnt setzen oben ). Dies scheint die Art und Weise zu sein, wie die meisten Pakete zum sys.path hinzugefügt werden, anstatt PYTHONPATH zu verwenden.

Hinweis: Unter OSX wurde von site.py ein spezieller zusätzlicher Suchpfad für 'Framework-Builds' hinzugefügt (scheint jedoch für die normale Verwendung von Python in der Befehlszeile zu funktionieren): /Library/Python/<version>/site-packages(z. B. für Python2.7 :) /Library/Python/2.7/site-packages/, in dem Pakete von Drittanbietern verwendet werden sollen installiert werden (siehe README in diesem Verzeichnis). So kann man dort eine Pfadkonfigurationsdatei hinzufügen, die zusätzliche Suchpfade /Library/Python/2.7/site-packages/pip-usr-local.pthenthält, z. B. eine Datei mit dem Namen, die enthält, /usr/local/lib/python2.7/site-packages/und dann fügt die Systempython diesen Suchpfad hinzu.

Pierz
quelle
10

Bei mir hat es funktioniert, als ich die .bash_profileDatei geändert habe . Das Ändern der .bashrcDatei funktionierte nur, bis ich die Shell neu startete.

Für Python 2.7 sollte es so aussehen:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

am Ende der .bash_profileDatei.

Peter Piper
quelle
1
Wenn ich das richtig verstehe, wird die Variable für Python-Sitzungen, die über das Terminal gestartet werden, nur exportiert, oder?
Jxramos
1
@jxramos - ja!
Peter Piper
9

Unter Linux können Sie einen symbolischen Link von Ihrem Paket zu einem Verzeichnis des PYTHONPATH erstellen, ohne sich mit den Umgebungsvariablen befassen zu müssen. Etwas wie:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
quelle
7

Das Hinzufügen export PYTHONPATH="${PYTHONPATH}:/my/other/path"zu ~ / .bashrc funktioniert möglicherweise nicht, wenn PYTHONPATHes derzeit nicht vorhanden ist (aufgrund von :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Das Hinzufügen des oben genannten zu meinem ~ / .bashrc hat mir unter Ubuntu 16.04 geholfen

Boyangeor
quelle
Ich habe es getan echo PYTHONPATHund nichts ist aufgetaucht! Das bedeutet, dass dieser PYTHONPATH nicht initiiert wurde. Ich füge diese Zeile einfach export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionin meine ~/.bashrcDatei ein und source ~/.bashrc sie. Später, als ich "$ PYTHONPATH" wiederholte, gab es mir einen :<PATH_TO_TF>/TensorFlow/models/research/object_detectionVorschlag, ob ich etwas falsch gemacht habe?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, wenn Sie PYTHONPATH zum ersten Mal exportieren, müssen Sie es ohne den ${PYTHONPATH}:Teil tun
Boyangeor
Danke, aber wenn ich meinen Computer neu starte, wird der Python-Pfad auf den zurückgesetzt, den ich auf den ersten gesetzt habe, dh :<PATH_TO_TF>/TensorFlow/models/research/object_detectionden zweiten entfernt export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. Irgendwelche Vorschläge dazu, wie man das behebt?
Anu
7

Unter MacOS, anstatt den Pfad zu einer bestimmten Bibliothek anzugeben. Geben Sie den vollständigen Pfad zum Stammprojektordner in an

~/.bash_profile 

machte meinen Tag zum Beispiel:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

danach tun:

source ~/.bash_profile
testsingh
quelle
6

Um die Antwort von awesomo zu ergänzen, können Sie diese Zeile auch in Ihr ~/.bash_profileoder einfügen~/.profile

Janex
quelle
Fügen Sie hinzu, .bash_profilewenn Sie Login-Shell verwenden, andernfalls verwenden Sie.profile
smac89
3

Das Hinzufügen eines neuen Pfads zu PYTHONPATH erfolgt manuell durch:

Hinzufügen des Pfads zu Ihrem ~ / .bashrc-Profil im Terminal durch:

vim ~/.bashrc

Fügen Sie Folgendes in Ihr Profil ein

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

Stellen Sie dann sicher, dass Sie Ihr bashrc-Profil als Quelle verwenden, wenn Sie Ihren Code im Terminal ausführen:

source ~/.bashrc 

Hoffe das hilft.

wpmoradi
quelle
2

Ich habe permanent in Windows Vista Python 3.5 hinzugefügt

System> Systemsteuerung> Erweiterte Systemeinstellungen> Erweitert (tippen Sie auf) Umgebungsvariablen> Systemvariablen> (wenn PYTHONPATH in der Spalte Variable nicht angezeigt wird) (klicken Sie auf) Neu> Variablenname: PYTHONPATH> Variablenwert:

Bitte schreiben Sie das Verzeichnis in den Variablenwert. Es sind Details der Antwort von Blue Peppers.

Cloud Cho
quelle
1

Das folgende Skript funktioniert auf allen Plattformen, da es sich um reines Python handelt. Es verwendet den Pathlib-Pfad, der hier unter https://docs.python.org/3/library/pathlib.html dokumentiert ist , damit er plattformübergreifend funktioniert. Sie führen es einmal aus, starten den Kernel neu und fertig. Inspiriert von https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
quelle
1

Dies ist ein Update für diesen Thread, der einige alte Antworten enthält.

Für diejenigen, die MAC-OS Catalina oder ein neueres (> = 10.15) verwenden, wurde ein neues Terminal mit dem Namen zsh(ein Ersatz für das alte bash) eingeführt.

Ich hatte aufgrund dieser Änderung einige Probleme mit den obigen Antworten und habe eine Problemumgehung durchgeführt, indem ich die Datei erstellt ~/.zshrcund das Dateiverzeichnis in das $PATHund eingefügt habe$PYTHONPATH

Also habe ich zuerst getan:

nano ~/.zshrc

Beim Öffnen des Editors habe ich folgenden Inhalt eingefügt:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

speicherte es und startete das Terminal neu.

WICHTIG: Der obige Pfad ist auf den Pfad meines Computers eingestellt. Sie müssten ihn an Ihre Python anpassen.

Caio Oliveira
quelle
0

In Python 3.6.4 können Sie sys.path über Python-Sitzungen hinweg wie folgt beibehalten:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Ich empfehle dringend, dass Sie virtualenv und virtualenvwrapper verwenden, da Sie sonst Ihren Pfad überladen

Quietscheentchen
quelle
-3

Der kürzeste Weg zwischen A B ist eine gerade Linie;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
quelle