dodanie katalogu do sys.path / PYTHONPATH

130

Próbuję zaimportować moduł z określonego katalogu.

Problem polega na tym, że jeśli sys.path.append(mod_directory)użyję do dołączenia ścieżki, a następnie otworzę interpreter Pythona, katalog mod_directoryzostanie dodany na koniec listy sys.path. Jeśli wyeksportuję PYTHONPATHzmienną przed otwarciem interpretera Pythona, katalog zostanie dodany na początek listy. W 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_directoryna początku, wewnątrz skryptu Pythona?

Niezafałszowana wyobraźnia
źródło
Próbowałem sitemodułu .
Zeinab Abbasimazar

Odpowiedzi:

178

Działa to zgodnie z dokumentacją. Wszystkie ścieżki określone w PYTHONPATHsą dokumentowane jako normalnie występujące po katalogu roboczym, ale przed standardowymi ścieżkami dostarczonymi przez interpreter. sys.path.append()dołącza do istniejącej ścieżki. Zobacz tutaj i tutaj . Jeśli chcesz, aby konkretny katalog był pierwszy, po prostu wstaw go na początku sys.path:

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

To powiedziawszy, zazwyczaj istnieją lepsze sposoby zarządzania importem niż bezpośrednie używanie PYTHONPATHlub manipulowanie sys.path. Zobacz na przykład odpowiedzi na to pytanie .

Ned Deily
źródło
Dziękuję za odpowiedź. Problem polegał na tym, że nie zdawałem sobie sprawy, że aby dodać moduł spakowany jako plik .egg, musisz dołączyć nazwę pliku zamiast tylko katalogu w pythonie 2.6
UnadulteratedImagination
2
Hej stary, to zepsuło moje django. Czy na pewno chcesz powiedzieć ludziom, aby umieścili to na górze?!? !!?
R Claven
16
@RClaven, przepraszam, trudno powiedzieć, do jakiej akcji i wyników się odnosisz: „umieść to na górze” i „złamał moje django” nie są zbyt precyzyjne. Czy możesz rozwinąć?
Ned Deily,
Więcej informacji na temat działania sys.path można znaleźć w tej odpowiedzi stackoverflow.com/a/38403654/850326
djhaskin987
2
Naprawdę powinieneś użyć „1” zamiast „0”! W przeciwnym razie możesz przerwać sys.path . Zobacz także stackoverflow.com/q/10095037/125507 .
kadee
9

Możesz użyć:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Δημητρης Παππάς
źródło
potrzebujesz ';' w oknach.
sanjivgupta
6

Jeśli chodzi o mnie, potrzebuję kawy na mojej ścieżce do Pythona. Mogę dodać ścieżkę do pliku /home/xy/.bashrcprzez add

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

do mojego /home/xy/.bashrcpliku.

Ale kiedy używam pycharm, ścieżki nadal nie ma.

Mogę więc dodać ścieżkę do PYTHONPATHzmiennej, uruchamiając -> edytuj konfigurację.

wprowadź opis obrazu tutaj

Jayhello
źródło
Najprostsza jest najlepsza odpowiedź, dodaj to dla rozwoju, a autouzupełnianie będzie działać
Gang
Zaktualizowałem .bashrc, jak wyjaśniono powyżej, ale nie znalazłem odzwierciedlenia w notatniku jupyter. Notatnik Jupyter nadal mówi, że moduł nie został znaleziony.
Athar,
3

Tymczasowa zmiana katalogów działa dobrze w przypadku importowania:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)
user3517603
źródło
0

Podczas uruchamiania skryptu Pythona z Powershell w systemie Windows powinno to działać:

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

# Now run the actual script
python your_script.py
Alexander Pacha
źródło