1 votos

¿Cómo pasar la entrada a un script desde la terminal?

Tengo una secuencia de comandos de python que espera una entrada de usuario como esta:

imagen de script

En lugar de ejecutar el programa e ingresar "John", quiero pasarle la entrada desde la línea de comandos como $ python script.py < "John" pero no funciona. ¿Hay alguna manera de lograr lo que quiero?

1voto

Kamil Maciorowski Puntos 897

Si la secuencia de comandos utiliza su stdin para leer datos, esta línea se utiliza

python script.py < "John"

debe trabajar, excepto que intenta enviar el contenido de un archivo de nombre John a la entrada de la secuencia de comandos (y es un error si no existe el archivo; supongo que esto te ha ocurrido). En Bash, hay un modo para enviar una cadena, aunque, aquí, de la cadena:

python script.py <<< "John"

Una nueva línea se añade automáticamente. La otra manera es con un pipeline:

printf '%s\n' "John" | python script.py

y esto debería funcionar incluso en la llanura sh. Así debería de ser este:

echo "John" | python script.py

Nota printf es en general mejor que echo, pero con este fijo cadena de ambos comandos deben trabajar a la derecha.


Ninguno de los anteriores funcionará si la secuencia de comandos utiliza directamente en su terminal de control (/dev/tty) en lugar de su stdin para leer la respuesta del usuario. Si es así, expect (como en esta otra respuesta) será útil. No nos muestran la secuencia de comandos de sí mismo, de modo que es imposible decir por seguro, usted debe saber.

1voto

DavidCara Puntos 146

Una forma realmente sencilla de lograr esto es usar sys.argv del módulo sys , que le permite acceder a los argumentos de la línea de comandos. sys.argv es una lista de los argumentos de la línea de comando, con sys.argv[0] siendo el nombre del script.

Podría aceptar un argumento de línea de comando si lo hay; de lo contrario, solicite al usuario la entrada:

 #!/usr/bin/python3
import sys

if len(sys.argv) > 1:
    name = sys.argv[1]
else:
    name = input("Enter name:")

print(name)
 

A continuación, llame al script con un argumento de línea de comando si es necesario: ./script.py John .

0voto

Una manera sencilla es crear una secuencia de comandos a la entrada de la información:

#!/usr/bin/expect
set cmd [lrange $argv 1 end]
set val [lindex $argv 0]

eval spawn $cmd
expect ":"
send "$val\r";
interact

Guardar este archivo somwehere (por ejemplo ~/sendInput.sh) y ejecutar sudo chmod +x ~/sendInput.sh para hacer el archivo ejecutable

ahora ejecute !/sendInput.sh "Jhon" python script.py Esto debe enviar la entrada de "Jhon" a la script.py una vez que el carácter ":" es enviado.

(Adaptada de https://srvfail.com/how-to-provide-ssh-password-inside-a-script-or-oneliner/)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: