2012-04-03 15 views
6

¿Existe una forma portátil de ejecutar un script de python desde un shell sin escribir su ruta completa?Cómo ejecutar un script de Python de forma portátil sin especificar su ruta completa

Por ejemplo, en Linux, quisiera mientras que en mi directorio

cd ~ 

para ser capaz de ejecutar un script en Python llamada run.py que es, digamos, en ~/tiempo/ruta/a/run .py, pero quiero ejecutarlo simplemente escribiendo

python run.py 

en lugar de

python ~/long/path/to/run.py 

espero algún tipo de se arch path list que contiene varios directorios al igual que la variable PATH, de modo que python run.py ejecuta el primer run.py que encuentra en uno de los directorios.

He considerado convertir run.py en un ejecutable y agregar su directorio a la variable PATH del sistema, pero no he podido encontrar una forma portátil de hacer un script python ejecutable.

EDITAR

Un año más tarde después de pedir, yo soy un poco menos novato, y veo que mi pregunta no era muy clara y no tiene mucho sentido, así que después de una pregunta voy a upvote aclarar algunas cosas

1) Portátil.

Cuando le pregunté esto, dije portable. Sin embargo, qué medios portátiles no están claros en este caso, y no le di mucho énfasis.

  • las plataformas: debería funcionar en POSIX (Linux, MacOS, etc.) y Windows

  • esto todavía no tiene mucho sentido ya que Windows utiliza cmd.exe y POSIX utiliza sh, por lo que cada uno podría ejecuta los comandos con una sintaxis diferente. Entonces, digamos que la cosa más portátil posible sería alimentar la misma entrada tanto a sh como a cmd.exe, ejecutando el script de python en ambos casos. En este caso, puede ejecutar el mismo comando desde una función ANSI C system, que usa sh en POSIX y cmd en Windows. ANSI C es una de las pocas cosas que es común en Windows y POSIX, la pregunta tiene sentido en ese caso.

2) Ejecutable

A continuación, la frase turning run.py into an executable, no está muy claro. Por eso estaba hablando de la estrategia de Linux de chmod +x run.py, agregue un shebang #!/usr/bin/env python y agregue su directorio al sistema add ~/long/path/to/the PATH environment variable. Pero esto no funcionará para Windows porque Windows no admite una propiedad de metadatos de archivos ejecutables como Linux y porque/usr/bin/env no existe necesariamente en Windows.

3) Extensión

Por último, en mi cabeza me estaba esperando una solución que no especifica qué tipo de ejecución de archivos es, por lo que si algún día nos decidimos a hacerlo, por ejemplo, un archivo Perl, sin las interfaces cambiarían

Por lo tanto, escribir run.py sería malo porque especificaría el tipo de archivo; sería mejor que ser capaz de escribir simplemente run

Respuesta

14

Si el directorio que contiene run.py está en el camino de búsqueda de módulos (por ejemplo, PYTHONPATH variable de entorno), que debe ser capaz de funcionar de esta manera:

python -m run 

Aquí está la documentación en la línea -m comando opción:

-mmodule-name
Búsquedas sys.path para el módulo nombrado y ejecuta el archivo correspondiente .py como una secuencia de comandos.

+0

Gracias FJ, esto es exactamente lo que estaba buscando, siento que tiene dos ventajas sobre el '#!' acercamiento: 2 –

+0

(específico Lo siento, medio comentario terminado) ... Gracias F.J, esto es lo que estaba buscando, siento que tiene dos ventajas sobre el '#!' enfoque: 1) no saturar los scripts 2) no saturando la variable PATH global, y usando el más específico PYTHONPATH en su lugar. La desventaja es, por supuesto, tener que escribir "python -m" todo el tiempo, lo que ocupa espacio y, lo que es peor, podría significar volver a escribir el código si algún día decides transformar tus secuencias de comandos python en, por ejemplo, scripts bash. –

+0

Intenté ejecutar python -m pero no funcionó ... Estoy seguro de que run.py está en PYTHONPATH porque puedo importarlo y aparece cuando importo sys; print sys.path ... ¿Me estoy perdiendo algo? –

4

Usted puede hacer un script ejecutable pitón añadiendo

#!/usr/bin/env python 

al principio del archivo, y lo que es ejecutable con chmod +x.

+0

Gracias alberge, no estaba seguro de que esto funcione en Windows, pero parece que #!/Usr/bin/env python se tratará como un comentario, y la instalación de python asocia automáticamente la ejecución de archivos .py con el intérprete de python. Esto es especialmente bueno si pones .py en tu EXTPATH, para que puedas ejecutar archivos de Python simplemente escribiendo "ejecutar" en lugar de "ejecutar.py", lo que significa que si alguna vez decides transformar tus scripts de python en decir, Perl, no necesitará volver a escribir las llamadas de script. Sería genial si hubiera una manera simple de ejecutar scripts en Linux sin escribir la extensión y sin agregar #! ... –

+0

Esto funciona genial con virtualenv – Henrik

0
  1. archivo pitón Hacer ejecutable (como "alberge" indicadas anteriormente)
  2. Crear algún directorio y poner este directorio en su variable PATH
  3. En este directorio, crear enlaces a los scripts de Python
1

respuesta después de la edición aclaración

prefiero la siguiente acercamiento al sugerido por @ F.J. porque no requiere que los usuarios especifiquen el tipo de archivo. Tenga en cuenta que esto no se especificó en la pregunta original, por lo que su respuesta a la pregunta original fue correcta.

Permite llamar al archivo pytest.py para evitar conflictos con un posible programa existente run.

En POSIX (MacOS, Linux) hacer lo que dijo @Petr, que se basa en lo que @alberge dijo:

  • chmod +x
  • añadir tinglado #!/usr/bin/env python
  • crear un directorio y añadirlo al camino . ubicaciones habituales en Linux son: ~/bin/para un solo usuario, /usr/local/bin/ para todos los usuarios
  • enlace simbólico (cp -s) el archivo con su PATH con nombre base pytest en lugar de pytest.py

en Windows:

  • crea un directorio y agrégalo a PATH. AFAIK, no hay lugar convencional para eso, ¿por qué no C:\bin\ y ~\bin\?
  • añadir .PY a la variable PATHEXT medio ambiente para que Windows reconocerá los archivos con extensión pitón como archivos ejecutables sin que sea necesario que escriba la extensión
  • archivos pitón
  • asociados con la python.exe intérprete (Windows Explorer> clic derecho> marcar "Usar siempre el programa seleccionado "). Hay una opción en el instalador de python que hace esto por usted.
  • enlace simbólico pytestcon extensión en el directorio bajo PATH (usando Enlace Shell Extension desde el Explorador de Windows o mklink name dest de cmd)

ahora system("pytest"); debería funcionar en ambos sistemas (sh bajo Linux, cmd bajo Windows)

Cuestiones relacionadas