Python: aggiungi PYTHONPATH durante l'esecuzione del modulo della riga di comando


91

Voglio correre:

python somescript.py somecommand

Ma quando lo eseguo devo PYTHONPATHincludere una certa directory. Non posso semplicemente aggiungerlo alle mie variabili di ambiente perché la directory che voglio aggiungere cambia in base al progetto che sto eseguendo. C'è un modo per modificare PYTHONPATHdurante l'esecuzione di uno script? Nota: non ho nemmeno una PYTHONPATHvariabile, quindi non devo preoccuparmi di aggiungerla o sovrascriverla durante l'esecuzione di questo script.

Risposte:


152

Per Mac / Linux;

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

Per Windows, imposta un wrapper pythonpath.bat;

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

e chiama il pythonpath.batfile di script come;

pythonpath.bat /foo/bar/baz somescript.py somecommand

@ İsmail - grazie. Tuttavia, come posso farlo durante l'esecuzione di uno script dal prompt dei comandi? Non sto eseguendo Python, importando cose e eseguendolo manualmente.
orokusaki

Su Mac / Linux farestiPYTHONPATH=/foo/bar python somescript.py somecommand
ismail

Ho provato python -c"import sys;sys.path.append('/my/dir')"e poi python myscript.py mycommand, ma ovviamente non condivide il percorso dalla prima sessione di interprete con quella successiva. Ah, ho appena visto il tuo prossimo commento, provando ora ... Non ha funzionato su WinXP.
orokusaki

1
Non esiste alcun unsetcomando per le variabili di ambiente su Windows. Aggiungere invece una setlocaldopo l'iniziale echo offe quindi endlocalsi verificherà un implicito quando lo script .bat termina (e PYTHONPATHverrà ripristinato al valore precedente).
martineau

5
Su Windows, se desideri aggiungere un percorso a quello esistente PYTHONPATH, potresti voler utilizzare set PYTHONPATH=%PYTHONPATH%;%1.
martineau

49
 import sys
 sys.path.append('your certain directory')

Fondamentalmente sys.path è un elenco con tutti i percorsi di ricerca per i moduli python. Viene inizializzato dall'interprete. Il contenuto di PYTHONPATH viene automaticamente aggiunto alla fine di tale elenco.


10
o sys.path.insert (0, '/ some / directory') per metterlo all'inizio del tuo percorso. Ciò consente al tuo materiale di sovrascrivere altre cose che potrebbero essere già su pythonpath.
sienkiew

Ho usato questa risposta per eseguire uninttest fuori dall'IDE di pydev-eclipse.
LAL

sys.path.append(r'D:\PyCharmProjects\cheese_shoppe')esempio in Windows.
Bob Stein

10

Se stai eseguendo il comando da una shell conforme a POSIX bash, puoi impostare la variabile d'ambiente in questo modo:

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

Se è tutto su una riga, il valore dell'ambiente PYTHONPATH si applica solo a quell'unico comando.

$ 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

Proprio quello che stavo cercando, grazie mille. Per qualche motivo la corsa python -c "import sys; sys.path.insert(0,'my/path'); import mymodule"non ha funzionato.
Luke Davis

0

Puoi provare questo per eseguire una funzione all'interno del tuo script

python -c "import sys; sys.path.append('/your/script/path'); import yourscript; yourscript.yourfunction()"

-1

Questo è per Windows:

Ad esempio, ho una cartella denominata "mygrapher" sul desktop. All'interno ci sono cartelle chiamate "calcolo" e "rappresentazione grafica" che contengono file Python di cui ha bisogno il mio file principale "grapherMain.py". Inoltre, "grapherMain.py" è memorizzato in "graphing". Per eseguire tutto senza spostare i file, posso creare uno script batch. Chiamiamo questo file batch "rungraph.bat".

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

Questo script si trova in "mygrapher". Per eseguire le cose, vorrei entrare nel mio prompt dei comandi, quindi fare:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)

6
e in che modo è diverso dalla risposta di @ İsmail "cartman" Dönmez?
Alex Okrushko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.