Shell Script: ejecute un programa de Python desde un script de shell

139

He intentado buscar la respuesta en Google pero sin suerte.

Necesito usar mi servidor de supercomputadora de obras, pero para que mi script de Python se ejecute, debe ejecutarse a través de un script de shell.

Por ejemplo quiero job.shejecutarpython_script.py

¿Cómo se puede lograr esto?

Harpal
fuente
2
¿Has intentado simplemente poner python python_script.pytu script de shell?
thkala
Um, python python_script.py. O solo ./python_script.pysi el guión tiene un shebang.
2
@delnan: ./python_script.py también requiere que el script sea ejecutable
thkala
¿Qué has probado exactamente y cuál es el problema? Ya sea que usted no lo hizo bien de una búsqueda en Google, o hay un montón que no nos está diciendo ...
thkala
3
Esta es una pregunta bastante antigua, pero la respuesta mejor / más completa es la de João Víctor. Asegúrese de leerlo.
Todavía

Respuestas:

193

Solo asegúrese de que el ejecutable de Python esté en su variable de entorno PATH y luego agregue su script

python path/to/the/python_script.py

Detalles:

  • En el archivo job.sh, pon esto
#!/bin/sh
python python_script.py
  • Ejecute este comando para que el script pueda ejecutarse por usted: chmod u+x job.sh
  • Ejecutarlo : ./job.sh
Jean-Bernard Jansen
fuente
2
Depende de tu sistema. Python 3 puede ser el tiempo de ejecución predeterminado de Python, o puede no serlo. Puede verificar ejecutando python --version, y puede aplicar la versión con python3 hello.py.
Jean-Bernard Jansen
¿Qué hacer si no encuentra las importaciones ya instaladas, como los pandas?
mah65
Significa que lanzó el binario de Python incorrecto o que el entorno no es correcto. En ese caso, debe llenar un virtualenv, luego ejecutar y source PATH/TO/VENV/bin/activateluego llamarpython python_script.py
Jean-Bernard Jansen
Estoy tratando de hacer esto en automator, y recibo un error; /path/to/Python: can't open file '/path/to/script': [Errno 1] Operation not permitted¿hay alguna manera de incluir mi código python en línea dentro del script bash?
Keyslinger
111

Método 1: crear un script de shell:

Supongamos que tiene un archivo de Python hello.py Cree un archivo llamado job.shque contenga

#!/bin/bash
python hello.py

márquelo ejecutable usando

$ chmod +x job.sh

entonces ejecútalo

$ ./job.sh

Método 2 (MEJOR): haga que la propia pitón se ejecute desde el shell:

Modifique su secuencia de comandos hello.pyy agregue esto como la primera línea

#!/usr/bin/env python

márquelo ejecutable usando

$ chmod +x hello.py

entonces ejecútalo

$ ./hello.py
Joao Victor
fuente
55
Edite su respuesta para que sea más legible. Puede usar el botón 101010 en el editor de respuestas para marcar el contenido del script como código.
thkala
1
Siempre se me olvida #!/usr/bin/env python. ¡Recuerde asegurarse de hacer referencia a la versión y ruta de Python correctas para su sistema!
Aún así
10

Imho, escribiendo

python /path/to/script.py

Está bastante mal, especialmente en estos días. ¿Qué pitón? python2.6? 2.7? 3.0? 3.1? La mayoría de las veces debe especificar la versión de Python en la etiqueta shebang del archivo de Python. Animo a usar

#! / usr / bin / env python2 #o python2.6 o python3 o incluso python3.1
por compatibilidad.

En tal caso, es mucho mejor tener el script ejecutable e invocarlo directamente:

#! / bin / bash

/path/to/script.py

De esta manera, la versión de Python que necesita solo está escrita en un archivo. La mayoría del sistema en estos días tiene python2 y python3 mientras tanto, y sucede que el enlace simbólico python apunta a python3 , mientras que la mayoría de la gente espera que apunte a python2 .

Enrico Carlesso
fuente
1
¿Puedes pasar los parámetros de la misma manera que con python script.py param?
Kristian
@ Kristian sí./abc.py -h
7

Guarde el siguiente programa como print.py:

#!/usr/bin/python3
print('Hello World')

Luego en el tipo de terminal:

chmod +x print.py
./print.py
Nishant Ingle
fuente
4

Esto funciona mejor para mí: agregue esto en la parte superior del script:

#!c:/Python27/python.exe

(C: \ Python27 \ python.exe es la ruta al python.exe en mi máquina) Luego ejecute el script a través de:

chmod +x script-name.py && script-name.py
peterb
fuente
Solo para aclarar, esto es específico de Windows. Y el aviso que uso es el Git bash. Lo encuentro super útil. Especialmente en el entorno de Windows
Peter
4

Esto funciona para mi:

  1. Cree un nuevo trabajo de archivo de shell. Entonces, digamos: touch job.shy agregue el comando para ejecutar el script de python (incluso puede agregar argumentos de línea de comando a ese python, generalmente predefinir mis argumentos de línea de comando).

    chmod +x job.sh

  2. Dentro job.shagregue los siguientes archivos py, digamos:

    python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file.py"

    python_file1.py argument1 argument2 argument3 >> testpy-output.txt && echo "Done with python_file1.py"

La salida de job.sh debería verse así:

Done with python_file.py

Done with python_file1.py

Utilizo esto generalmente cuando tengo que ejecutar múltiples archivos de Python con diferentes argumentos, predefinidos.

Nota: solo un rápido aviso sobre lo que está sucediendo aquí:

python_file.py argument1 argument2 argument3 >> testpy-output.txt && echo "completed with python_file.py" . 

  • Aquí el script de shell ejecutará el archivo python_file.py y agregará múltiples argumentos de línea de comandos en tiempo de ejecución al archivo python.
  • Esto no significa necesariamente que también tenga que pasar argumentos de línea de comando.
  • Puedes usarlo como: python python_file.pysimple y llanamente. A continuación, el >> imprimirá y almacenará la salida de este archivo .py en el archivo testpy-output.txt.
  • && es un operador lógico que se ejecutará solo después de que lo anterior se ejecute correctamente y como eco opcional "completado con python_file.py" se hará eco en su cli / terminal en tiempo de ejecución.
geekidharsh
fuente
4

Debería poder invocarlo como python scriptname.pyp. Ej.

# !/bin/bash

python /home/user/scriptname.py 

También asegúrese de que el script tenga permisos para ejecutarse.

Puede hacerlo ejecutable usando chmod u+x scriptname.py.

Shpongle
fuente
2

Yo uso esto y funciona bien

#/bin/bash
/usr/bin/python python python_script.py
Max Hay
fuente
1

Como las otras publicaciones dicen todo (y me topé con esta publicación mientras buscaba lo siguiente).
Aquí hay una manera de cómo ejecutar un script de Python desde otro script de Python:

Python 2:

execfile("somefile.py", global_vars, local_vars)

Python 3:

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

y puedes suministrar args proporcionando alguna otra sys.argv

dCSeven
fuente