Python: agregue PYTHONPATH durante la ejecución del módulo de línea de comando

86

Quiero correr:

python somescript.py somecommand

Pero, cuando ejecuto esto, necesito PYTHONPATHincluir un directorio determinado. No puedo simplemente agregarlo a mis variables de entorno porque el directorio al que quiero agregar cambia según el proyecto que estoy ejecutando. ¿Hay alguna forma de alterar PYTHONPATHmientras se ejecuta un script? Nota: Ni siquiera tengo una PYTHONPATHvariable, por lo que no necesito preocuparme por agregarla en lugar de anularla durante la ejecución de este script.

orokusaki
fuente

Respuestas:

148

Para Mac / Linux;

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

Para Windows, configure un contenedor pythonpath.bat;

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

y llamar al pythonpath.batarchivo de script como;

pythonpath.bat /foo/bar/baz somescript.py somecommand
ismail
fuente
@ İsmail - gracias. Sin embargo, ¿cómo puedo hacer eso mientras ejecuto un script desde mi símbolo del sistema? No estoy ejecutando Python, importando cosas y ejecutándolo manualmente.
Orokusaki
En Mac / Linux lo haríaPYTHONPATH=/foo/bar python somescript.py somecommand
ismail
Lo intenté python -c"import sys;sys.path.append('/my/dir')"y luego python myscript.py mycommand, pero obviamente no comparte el camino desde la primera sesión de intérprete con la siguiente. Ah, acabo de ver su siguiente comentario, lo intento ahora ... No funcionó en WinXP.
orokusaki
1
No hay ningún unsetcomando de variable de entorno en Windows. En su lugar, agregue un setlocaldespués de la inicial echo offy luego endlocalse producirá un implícito cuando finalice el script .bat (y PYTHONPATHse restaurará a su valor anterior).
Martineau
5
En Windows, si desea agregar una ruta a la existente PYTHONPATH, es posible que desee usar set PYTHONPATH=%PYTHONPATH%;%1.
Martineau
49
 import sys
 sys.path.append('your certain directory')

Básicamente, sys.path es una lista con todas las rutas de búsqueda de módulos de Python. Lo inicializa el intérprete. El contenido de PYTHONPATH se agrega automáticamente al final de esa lista.

Piotr Czapla
fuente
10
o sys.path.insert (0, '/ some / directory') para ponerlo al principio de su ruta. Esto permite que su material anule otras cosas que ya pueden estar en pythonpath.
sienkiew
Usé esta respuesta para ejecutar uninttest fuera de pydev-eclipse IDE.
LAL
sys.path.append(r'D:\PyCharmProjects\cheese_shoppe')ejemplo en Windows.
Bob Stein
9

Si está ejecutando el comando desde un shell compatible con POSIX, como bash, puede configurar la variable de entorno de esta manera:

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

Si todo está en una línea, el valor del entorno PYTHONPATH se aplica solo a ese 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
Ned Deily
fuente
Justo lo que estaba buscando, muchas gracias. Por alguna razón, correr python -c "import sys; sys.path.insert(0,'my/path'); import mymodule"no funcionó.
Luke Davis
0

Puede intentar esto para ejecutar una función dentro de su script

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

Esto es para Windows:

Por ejemplo, tengo una carpeta llamada "mygrapher" en mi escritorio. En el interior, hay carpetas llamadas "cálculo" y "gráficos" que contienen archivos de Python que necesita mi archivo principal "grapherMain.py". Además, "grapherMain.py" se almacena en "gráficos". Para ejecutar todo sin mover archivos, puedo hacer un script por lotes. Llamemos a este archivo por lotes "rungraph.bat".

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

Este script se encuentra en "mygrapher". Para ejecutar cosas, entraría en mi símbolo del sistema y luego haría:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)
Jack
fuente
5
¿y en qué se diferencia de la respuesta de @ İsmail 'cartman' Dönmez?
Alex Okrushko