2013-04-19 19 views
68

Ich versuche, ein Modul aus einem bestimmten Verzeichnis zu importieren.Verzeichnis zu sys.path/PYTHONPATH hinzufügen

Das Problem ist, dass, wenn ich sys.path.append(mod_directory) verwenden, um den Pfad anzufügen und dann den Python-Interpreter öffnen, das Verzeichnis mod_directory wird am Ende der Liste sys.path hinzugefügt. Wenn ich die Variable PYTHONPATH vor dem Öffnen des Python-Interpreters exportiere, wird das Verzeichnis am Anfang der Liste hinzugefügt. Im letzteren Fall kann ich das Modul importieren, aber im ersten Fall kann ich das nicht.

Kann jemand erklären, warum dies geschieht und geben Sie mir eine Lösung, die die mod_directory an den Start, innerhalb ein Python-Skript hinzufügen?

+0

Ich habe ['site' Modul] versucht (https://docs.python.org/3/library/site.html#site.addsitedir). –

Antwort

95

Dies funktioniert wie dokumentiert. Alle Pfade, die in PYTHONPATH angegeben sind, sind dokumentiert als normalerweise nach dem Arbeitsverzeichnis, aber vor den vom Standardinterpreter bereitgestellten Pfaden. sys.path.append() hängt an den vorhandenen Pfad an. Siehe here und here. Wenn Sie ein bestimmtes Verzeichnis wollen zuerst kommen, legen Sie sie einfach an der Spitze sys.path:

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

Das heißt, es gibt in der Regel bessere Möglichkeiten, um Importe zu verwalten als entweder mit PYTHONPATH oder sys.path direkt zu manipulieren. Siehe zum Beispiel die Antworten auf this question.

+0

danke für die Antwort. Das Problem war, dass ich nicht erkannte, dass, um Modul als .egg-Datei gepackt hinzuzufügen, müssen Sie den Dateinamen statt nur das Verzeichnis in Python 2.6 – UnadulteratedImagination

+1

Hey Mann, das brach meine Django. Sind Sie sicher, dass Sie den Leuten sagen wollen, dass sie es an die Spitze setzen sollen?!? !!? –

+12

@RClaven, tut mir leid, es ist schwer zu sagen, auf welche Aktion und Ergebnisse du dich beziehst: "lege es an die Spitze" und "brich meinen Django" sind nicht sehr präzise. Kannst du es ausarbeiten? –

1

könnten Sie verwenden:

import os 
path = 'the path you want' 
os.environ['PATH'] += ':'+path 
1

Vorübergehend wechselnden dirs funktioniert gut für den Import:

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

Wenn ein Python-Skript von Powershell unter Windows ausgeführt wird, sollte diese Arbeit:

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

# Now run the actual script 
python your_script.py 
Verwandte Themen