Hinzufügen eines Verzeichnisses zu sys.path / PYTHONPATH

130

Ich versuche, ein Modul aus einem bestimmten Verzeichnis zu importieren.

Das Problem ist, dass, wenn ich sys.path.append(mod_directory)den Pfad mod_directoryanhänge und dann den Python-Interpreter öffne, das Verzeichnis am Ende der Liste sys.path hinzugefügt wird. Wenn ich die PYTHONPATHVariable exportiere , bevor ich den Python-Interpreter öffne, wird das Verzeichnis am Anfang der Liste hinzugefügt. Im letzteren Fall kann ich das Modul importieren, im ersteren jedoch nicht.

Kann jemand erklären, warum dies geschieht, und mir eine Lösung geben, um das mod_directoryam Anfang in einem Python-Skript hinzuzufügen ?

Unverfälschte Vorstellungskraft
quelle
Ich habe siteModul ausprobiert .
Zeinab Abbasimazar

Antworten:

178

Dies funktioniert wie dokumentiert. Alle in angegebenen Pfade PYTHONPATHwerden als normal nach dem Arbeitsverzeichnis, jedoch vor den vom Standardinterpreter bereitgestellten Pfaden dokumentiert. sys.path.append()wird an den vorhandenen Pfad angehängt. Sehen Sie hier und hier . Wenn ein bestimmtes Verzeichnis an erster Stelle stehen soll, fügen Sie es einfach am Kopf von sys.path ein:

import sys
sys.path.insert(0,'/path/to/mod_directory')

Allerdings gibt es normalerweise bessere Möglichkeiten, Importe zu verwalten, als sie direkt zu verwenden PYTHONPATHoder zu manipulieren sys.path. Siehe zum Beispiel die Antworten auf diese Frage .

Ned Deily
quelle
danke für die Antwort. Das Problem war, dass ich nicht wusste, dass man zum Hinzufügen eines als .egg-Datei verpackten Moduls den Dateinamen anstelle nur des Verzeichnisses in Python 2.6
UnadulteratedImagination
2
Hey Mann, das hat meinen Django kaputt gemacht. Bist du sicher, dass du den Leuten sagen willst, dass sie es an die Spitze setzen sollen?!? !!?
R Claven
16
@RClaven, sorry, es ist schwer zu sagen, auf welche Aktion und Ergebnisse Sie sich beziehen: "Setzen Sie es an die Spitze" und "Brach meinen Django" sind nicht sehr präzise. Können Sie das näher erläutern?
Ned Deily
Weitere Informationen zur Funktionsweise von sys.path finden Sie in dieser Antwort. Stackoverflow.com/a/38403654/850326
djhaskin987
2
Sie sollten wirklich "1" anstelle von "0" verwenden! Andernfalls brechen Sie sys.path . Siehe auch stackoverflow.com/q/10095037/125507 .
Kadee
9

Du könntest benutzen:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Δημητρης Παππάς
quelle
du brauchst ';' in Fenstern.
Sanjivgupta
6

Was mich betrifft, muss ich mich auf meinen Python-Pfad einlassen. Ich kann den Pfad zur Datei /home/xy/.bashrcdurch Hinzufügen hinzufügen

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH.

zu meiner /home/xy/.bashrcDatei.

Aber wenn ich Pycharm benutze, ist der Pfad immer noch nicht in.

So kann ich der PYTHONPATHVariablen einen Pfad hinzufügen , indem ich -> Konfiguration bearbeiten ausführe.

Geben Sie hier die Bildbeschreibung ein

Jayhello
quelle
Die einfachste ist die beste Antwort. Fügen Sie dies für die Entwicklung hinzu, damit die automatische Vervollständigung funktioniert
Gang
Ich habe die .bashrc wie oben erläutert aktualisiert, sie jedoch nicht im Jupyter-Notizbuch wiedergegeben. Jupyter Notebook sagt immer noch Modul nicht gefunden.
Athar
3

Das vorübergehende Ändern von Verzeichnissen eignet sich gut zum Importieren von:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)
user3517603
quelle
0

Wenn Sie ein Python-Skript unter Powershell unter Windows ausführen, sollte dies funktionieren:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py
Alexander Pacha
quelle