Python - dodaj PYTHONPATH podczas uruchamiania modułu wiersza poleceń

86

Chcę biec:

python somescript.py somecommand

Ale kiedy to uruchamiam, muszę PYTHONPATHdołączyć określony katalog. Nie mogę po prostu dodać go do moich zmiennych środowiskowych, ponieważ katalog, który chcę dodać, zmienia się na podstawie uruchomionego projektu. Czy istnieje sposób na zmianę PYTHONPATHpodczas uruchamiania skryptu? Uwaga: nie mam nawet PYTHONPATHzmiennej, więc nie muszę się martwić o dołączenie do niej, a nie nadpisanie jej podczas uruchamiania tego skryptu.

orokusaki
źródło

Odpowiedzi:

148

Dla Mac / Linux;

PYTHONPATH=/foo/bar/baz python somescript.py somecommand

W systemie Windows skonfiguruj opakowanie pythonpath.bat;

@ECHO OFF
setlocal
set PYTHONPATH=%1
python %2 %3
endlocal

i wywołać pythonpath.batplik skryptu, taki jak;

pythonpath.bat /foo/bar/baz somescript.py somecommand
ismail
źródło
@ İsmail - dzięki. Jak jednak mogę to zrobić, uruchamiając skrypt z wiersza poleceń? Nie używam Pythona, nie importuję rzeczy i nie uruchamiam go ręcznie.
orokusaki
Na Mac / Linux zrobiłbyś toPYTHONPATH=/foo/bar python somescript.py somecommand
ismail
Próbowałem, python -c"import sys;sys.path.append('/my/dir')"a potem python myscript.py mycommand, ale oczywiście nie dzieli ścieżki z pierwszej sesji tłumaczeniowej z następną. Ach, właśnie zobaczyłem twój następny komentarz, próbuję teraz ... Nie działa w WinXP.
orokusaki,
1
W unsetsystemie Windows nie ma polecenia zmiennej środowiskowej. Zamiast tego dodaj znak setlocalpo inicjału, echo offa po endlocalzakończeniu działania skryptu .bat wystąpi niejawny (i PYTHONPATHzostanie przywrócony do jego poprzedniej wartości).
martineau
5
W systemie Windows, jeśli chcesz dołączyć istniejącą ścieżkę PYTHONPATH, możesz użyć set PYTHONPATH=%PYTHONPATH%;%1.
martineau
49
 import sys
 sys.path.append('your certain directory')

Zasadniczo sys.path to lista ze wszystkimi ścieżkami wyszukiwania dla modułów Pythona. Jest inicjowany przez interpreter. Zawartość PYTHONPATH jest automatycznie dodawana na końcu tej listy.

Piotr Czapla
źródło
10
lub sys.path.insert (0, '/ some / directory'), aby umieścić go na początku ścieżki. Dzięki temu Twój materiał może zastąpić inne rzeczy, które mogą już znajdować się na pythonpath.
sienkiew
Użyłem tej odpowiedzi do uruchomienia uninttest poza IDE pydev-eclipse.
LAL
sys.path.append(r'D:\PyCharmProjects\cheese_shoppe')przykład w systemie Windows.
Bob Stein
9

Jeśli uruchamiasz polecenie z powłoki zgodnej z POSIX, na przykład bash, możesz ustawić zmienną środowiskową w następujący sposób:

PYTHONPATH="/path/to" python somescript.py somecommand

Jeśli wszystko jest w jednym wierszu, wartość środowiska PYTHONPATH ma zastosowanie tylko do tego jednego polecenia.

$ echo $PYTHONPATH

$ python -c 'import sys;print("/tmp/pydir" in sys.path)'
False
$ PYTHONPATH=/tmp/pydir python -c 'import sys;print("/tmp/pydir" in sys.path)'
True
$ echo $PYTHONPATH
Ned Deily
źródło
Właśnie tego szukałem, wielkie dzięki. Z jakiegoś powodu bieganie python -c "import sys; sys.path.insert(0,'my/path'); import mymodule"nie działało.
Luke Davis
0

Możesz spróbować wykonać tę funkcję w swoim skrypcie

python -c "import sys; sys.path.append('/your/script/path'); import yourscript; yourscript.yourfunction()"
Marco Rossi
źródło
-1

Dotyczy to okien:

Na przykład mam na pulpicie folder o nazwie „mygrapher”. Wewnątrz znajdują się foldery zwane „obliczenia” i „wykresy”, które zawierają pliki Pythona, których potrzebuje mój główny plik „grapherMain.py”. Ponadto „grapherMain.py” jest przechowywany w „graphing”. Aby uruchomić wszystko bez przenoszenia plików, mogę zrobić skrypt wsadowy. Nazwijmy ten plik wsadowy „rungraph.bat”.

@ECHO OFF
setlocal
set PYTHONPATH=%cd%\grapher;%cd%\calculation
python %cd%\grapher\grapherMain.py
endlocal

Ten skrypt znajduje się w „mygrapher”. Aby uruchomić rzeczy, wchodziłem do wiersza poleceń, a następnie robiłem:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)
Jacek
źródło
5
i czym różni się to od odpowiedzi @ İsmail 'cartman' Dönmez?
Alex Okrushko