2013-04-19 20 views
68

Próbuję zaimportować moduł z określonego katalogu.dodawanie katalogu do sys.path/PYTHONPATH

Problem polega na tym, że jeśli użyję sys.path.append(mod_directory) do dołączenia ścieżki, a następnie otwarcia interpretera python, katalog mod_directory zostanie dodany na końcu listy sys.path. Jeśli wyeksportuję zmienną PYTHONPATH przed otwarciem interpretera python, katalog zostanie dodany do początku listy. W tym drugim przypadku mogę zaimportować moduł, ale w pierwszym nie mogę.

Czy ktoś może wyjaśnić, dlaczego tak się dzieje i dać mi rozwiązanie, aby dodać mod_directory na początek, wewnątrz skrypt Pythona?

+0

Próbowałem już modułu '' site' (https://docs.python.org/3/library/site.html#site.addsitedir). –

Odpowiedz

95

Działa to zgodnie z dokumentacją. Wszelkie ścieżki określone w PYTHONPATH są dokumentowane jako normalnie przychodzące po katalogu roboczym, ale przed standardowymi ścieżkami dostarczanymi przez interpreter. sys.path.append() dołącza do istniejącej ścieżki. Zobacz here i here. Jeśli chcesz konkretny katalog na pierwszym miejscu, po prostu włóż go na czele sys.path:

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

Powiedział, że tam są zazwyczaj lepsze sposoby zarządzania importu niż albo za pomocą PYTHONPATH lub manipulowania sys.path bezpośrednio. Zobacz na przykład odpowiedzi na this question.

+0

dzięki za odpowiedź. Problem polegał na tym, że nie zdawałem sobie sprawy, że aby dodać moduł spakowany jako plik .egg, musisz podać nazwę pliku zamiast tylko katalogu w pythonie 2.6 – UnadulteratedImagination

+1

Hej, to zepsuło moje django. Czy na pewno chcesz powiedzieć ludziom, żeby umieścili to na górze?!? !!? –

+12

@RClaven, przykro mi, ciężko powiedzieć, jakie działania i wyniki mają na celu: "umieść to na górze" i "zepsułeś moje django" nie są zbyt precyzyjne. Czy możesz rozwinąć? –

1

Można użyć:

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

Tymczasowa zmiana katalogów działa dobrze dla importu:

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

Po uruchomieniu skryptu Pythona z PowerShell pod Windows, to powinno działać:

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

# Now run the actual script 
python your_script.py