Llamar al script de Python desde bash con argumento

91

Sé que puedo ejecutar un script python desde mi script bash usando lo siguiente:

python python_script.py

Pero, ¿qué pasa si quisiera pasar una variable / argumento a mi script de Python desde mi script de bash? ¿Cómo puedo hacer eso?

Básicamente, bash resolverá un nombre de archivo y luego python lo cargará, pero necesito enviar el nombre de archivo de bash a python cuando lo llame.

Palanqueta
fuente
cuando se ejecuta python python_script.pyen su shell predeterminado en Debian, ya está usando bash ... así que hágalo en su script bash:python python_script.py arg1 arg2 ...
Oz123
@Jimmy Pregunta no preparada Creo que es muy fácil Enlace: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Respuestas:

133

Para ejecutar una secuencia de comandos de Python en una secuencia de comandos de bash, debe llamar al mismo comando que usaría dentro de una terminal. Por ejemplo

> python python_script.py var1 var2

Para acceder a estas variables dentro de Python, necesitará

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
duckman_1991
fuente
Gracias. Sin embargo, de esta manera se restringe el archivo python para un solo caso de uso. ¿Hay alguna forma de llamar a métodos de un archivo python con parámetros dinámicos dentro de los scripts bash? De esta forma, podremos utilizar el mismo archivo de Python. Intenté hacer esto con llamadas a métodos de archivo python con $ var dentro del script bash. Pero de alguna manera falló.
burcak
@burcak Si desea ejecutar el archivo de Python de forma paralela en función de los parámetros dinámicos, primero construya la ruta completa << ruta de ubicación de la secuencia de comandos de Python >> / << nombre de la secuencia de comandos de Python >> param1 param2 | << Ruta de la ubicación de la secuencia de comandos de Python >> / << nombre de la secuencia de comandos de Python >> param3 param4 en la secuencia de comandos de bash, luego pase la salida como un argumento a la siguiente secuencia de comandos de Python, import sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') para cmd en cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds finalized')
Thiru
21

Utilizar

python python_script.py filename

y en tu secuencia de comandos de Python

import sys
print sys.argv[1]
NPE
fuente
21

Además sys.argv, también eche un vistazo al módulo argparse , que ayuda a definir opciones y argumentos para los scripts.

El módulo argparse facilita la escritura de interfaces de línea de comandos fáciles de usar.

miku
fuente
Estoy de acuerdo, para mí argparse es una opción mucho mejor que sys.argv
Mo Ali
8

Opción integrada:

Envuelva el código de Python en una función bash.

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

Utilice variables de entorno para pasar datos a su secuencia de comandos de Python incrustada.

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html

user77115
fuente
1

usar en el script:

echo $(python python_script.py arg1 arg2) > /dev/null

o

python python_script.py "string arg"  > /dev/null

El script se ejecutará sin salida.

burseaner
fuente
¿Es posible reemplazar "string arg" con una variable que es de bash?
CodeGuru
1

Tengo un script bash que llama a una pequeña rutina de Python para mostrar una ventana de mensaje. Como necesito usar killall para detener el script de Python, no puedo usar el método anterior, ya que significaría ejecutar killall python, lo que podría eliminar otros programas de Python, así que uso

pythonprog.py "$argument"& # El & devuelve el control directamente al script bash, por lo que debe estar fuera de las comillas invertidas. La vista previa de este mensaje lo muestra sin "` "ninguno de los lados del comando por alguna razón.

Siempre que la secuencia de comandos de python se ejecute desde la cli por nombre en lugar de python pythonprog.py, esto funciona dentro de la secuencia de comandos. Si necesita más de un argumento, use un espacio entre cada uno dentro de las comillas.

Dave Thebuskeruk
fuente
-1

y eche un vistazo al módulo getopt . ¡Funciona bastante bien para mí!

HappyHacking
fuente
el inicio de getopt docs : Nota: El módulo getopt es un analizador de opciones de línea de comando cuya API está diseñada para ser familiar para los usuarios de la función C getopt (). Los usuarios que no estén familiarizados con la función C getopt () o que deseen escribir menos código y obtener mejor ayuda y mensajes de error deberían considerar usar el módulo argparse en su lugar.
cate