Esta respuesta discute cómo ejecutar un fragmento de Python de varias líneas desde la línea de comandos en una terminal. Noté que la respuesta funciona muy bien dentro de los scripts de shell, incluso con sangría anidada, lo cual es muy bueno, por ejemplo
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
huellas dactilares:
0
hello
hello
1
hello
hello
2
hello
hello
Sin embargo, estoy teniendo dificultades para compartir variables entre el script de shell y el fragmento de Python.
¿Cómo puedo recopilar la salida del subíndice python en el script bash? (por ejemplo, en una variable como
$output
).¿Cómo puedo pasar una variable bash (por ejemplo
$some_text
) al script Python?
python - <<EOF
lugar.Respuestas:
Obteniendo una variable a Python
Dado que (cuando
EOF
no se cita el marcador) la sustitución de la variable se produce antes de pasar el texto del heredoc apython
la entrada estándar, puede lanzar la variable directamente en el script.Si lo
some_text
fueratest
, Python lo veríasome_text = "test"
. Sin embargo, tenga en cuenta que puede verse como una vulnerabilidad de inyección de código. Sisome_text
fuera"; import os; os.system("evil-command"); x = "
, por ejemplo, python vería:y ejecuta ese malvado comando.
Si desea poder extraer su código Python directamente en un script sin ninguna modificación, puede exportar su variable.
y úsalo
os.environ
para recuperarlo.Ese es un enfoque mucho más sano / seguro.
Obteniendo salida de Python
Puede usar la sustitución de comandos para recopilar la salida del script.
(tenga en cuenta que se eliminan todos los caracteres de línea nueva finales)
fuente
"You could also pass the variable to the script as an argument"
, ¿cómo harías eso teniendo en cuenta que el script de Python está incrustado dentro del script de shell?print '$SHELL'
, el resultado sería/bin/bash
o lo que sea que sea su shell. Si cambia la primera línea apython - <<'END'
, la salida sería$SHELL
. Si está copiando y pegando el código existente para incrustarlo en un script bash, es casi seguro que no quiere sustituciones de shell: desea que el código se ejecute de la misma manera que cuando no está incrustado en un script bash, ¿verdad?El problema con su enfoque es que el script de python incrustado ya no tiene acceso al stdin original (ya que su stdin es ... en sí mismo).
Si ese es un problema, puede escribir:
O si el script de Python puede contener comillas simples:
O:
fuente
Use un guión como nombre de archivo:
No sé si
sys.argv[1:]
es la forma correcta de hacer esto en Python. Para -e / -c puede especificar el final de los argumentos con -:Capturando salida y redirigiendo STDERR:
fuente
1) Podría escribir asignaciones variables a un archivo en Python, y luego obtenerlo en su script bash.
2) Dado que su palabra (EOF) no se cita, todas las líneas del documento aquí están sujetas a la expansión de parámetros. Puede usar esto para pasar cosas al script de Python.
fuente