¿Cómo puedo usar una secuencia de comandos Python en la línea de comando sin cd-ing a su directorio? ¿Es el camino del pitón?

157

¿Cómo puedo hacer uso de PYTHONPATH? Cuando intento ejecutar un script en la ruta, no se encuentra el archivo. Cuando cd al directorio que contiene el script, el script se ejecuta. Entonces, ¿de qué sirve el PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Después de cd al directorio de archivos se ejecuta.

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

¿Por qué no puedo usar PYTHONPATH?

Randy Skretka
fuente
1
¿Podemos cambiar el título de esta publicación? En realidad no está pidiendo una explicación de PYTHONPATH.
Nico Cernek
Título editado porque esto es lo primero que aparece cuando buscas en GooglePYTHONPATH
raphael

Respuestas:

194

Creo que estás un poco confundido. PYTHONPATH establece la ruta de búsqueda para importar módulos de Python, no para ejecutarlos como lo está intentando.

PYTHONPATH Aumenta la ruta de búsqueda predeterminada para los archivos del módulo. El formato es el mismo que la RUTA del shell: uno o más nombres de ruta de directorio separados por os.pathsep (por ejemplo, dos puntos en Unix o punto y coma en Windows). Los directorios inexistentes se ignoran silenciosamente.

Además de los directorios normales, las entradas individuales de PYTHONPATH pueden referirse a archivos zip que contienen módulos Python puros (ya sea en formato fuente o compilado). Los módulos de extensión no se pueden importar desde archivos zip.

La ruta de búsqueda predeterminada depende de la instalación, pero generalmente comienza con el prefijo / lib / pythonversion (vea PYTHONHOME arriba). Siempre se adjunta a PYTHONPATH.

Se insertará un directorio adicional en la ruta de búsqueda frente a PYTHONPATH como se describió anteriormente en Opciones de interfaz. La ruta de búsqueda se puede manipular desde un programa Python como la variable sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Lo que estás buscando es RUTA.

export PATH=$PATH:/home/randy/lib/python 

Sin embargo, para ejecutar su script de Python como un programa, también debe establecer un shebang para Python en la primera línea. Algo como esto debería funcionar:

#!/usr/bin/env python

Y dale privilegios de ejecución:

chmod +x /home/randy/lib/python/gbmx.py

Entonces deberías poder simplemente correr gmbx.pydesde cualquier lugar.

Pedro Werneck
fuente
2
Gracias amigo. Todavía estoy resolviendo esto. Mi script tiene éxito al importar mis módulos desde mi PYTHONPATH personalizada. Y ahora entiendo la diferencia: se trata de script vs módulo; llamada al script de comandos vs. importación de Python. Sí, de hecho export PATH=$PATH:/home/etc
usaré
57

Estás confundiendo PATH y PYTHONPATH. Usted necesita hacer ésto:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH es utilizado por el intérprete de python para determinar qué módulos cargar.

El shell utiliza PATH para determinar qué ejecutables ejecutar.

Ricardo
fuente
38

PYTHONPATHsolo afecta a las importdeclaraciones, no a la búsqueda de intérpretes de Python de nivel superior de archivos de python dados como argumentos.

La necesidad PYTHONPATHde configurar no es una gran idea, ya que con cualquier cosa que dependa de las variables de entorno, replicar las cosas de manera consistente en diferentes máquinas se vuelve complicado. Mejor es usar 'paquetes' de Python que se pueden instalar (usando 'pip' o distutils) en rutas dependientes del sistema que Python ya conoce.

Eche un vistazo a https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'The Hitchhiker's Guide to Packaging', y también http://docs.python.org/3/tutorial /modules.html : que explica PYTHONPATH y paquetes en un nivel inferior.

estructura codificada
fuente
Punto a favor. Sin embargo, en este caso particular, agregar a PYTHONPATH parece funcionar bien. Como un usuario en una máquina, puedo usar y reutilizar algún código .py ya escrito.
Randy Skretka
1
Sinceramente, no creo que instalar cosas en rutas dependientes del sistema, con acceso de root requerido, sea una mejor idea que usarlas PYTHONPATH. Ya no cuento cuántas veces he tenido que lidiar con un programa rudimentario de Python que insistía en pip installlo que era un usuario habitual en un host no solo sin acceso a la raíz (sé que pip puede hacer una instalación local) sino También sin pepita. Aquí hay un consejo para todos los que distribuyen el software Python: primero intente instalar su propio software en un host Linux vanilla donde no tenga acceso de root y solo la distribución central de Python sin pip.
amn
3

Creo que estás confundido entre PATH y PYTHONPATH. Todo lo que tiene que hacer para ejecutar un 'script' es agregar su directorio parental a su variable PATH. Puedes probar esto ejecutando

which myscript.py

Además, si myscripy.pydepende de módulos personalizados, sus directorios parentales también deben agregarse a la variable PYTHONPATH. Desafortunadamente, debido a que los diseñadores de Python estaban claramente en las drogas, probar sus importaciones en la respuesta con lo siguiente no garantizará que su PYTHONPATH esté configurado correctamente para su uso en un script. Esta parte de la programación de Python es mágica y no se puede responder adecuadamente en stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule
W4t3randWind
fuente
3

Con PYTHONPATH configurado como en su ejemplo, debería poder hacer

python -m gmbx

-mla opción hará que Python busque su módulo en las rutas en las que Python generalmente busca módulos, incluido lo que agregó a PYTHONPATH. Cuando ejecuta un intérprete como python gmbx.py, busca un archivo en particular y PYTHONPATH no se aplica.

Tigran Saluev
fuente