Lo que estoy tratando de hacer es ejecutar python en una ventana de terminal y redirigir su stdin desde una tubería con nombre. Luego escribo en la tubería con nombre en otra terminal y hago que ese comando se ejecute en python.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
Lo que sucede es que Python imprime Hello World
y sale. Lo que quiero hacer es mantener Python ejecutándose para tomar el siguiente comando. ¿Cómo hago esto en el shell?
exec 3> p1
haciendo y qué es&3
yexec 3> &1
? Gracias.exec 3>&-
funcionaría igual queexec 3>&1
aquí?3>&-
aquí.3>&1
funcionaría bien pero tiene poco sentido. GraciasPuede usar
tail -f
para mantener abierto el fifo después deecho
escribir en él.Por que esto funciona
python
está leyendo dep1
. Cuando llega al final del archivo, deja de leer. Este es un comportamiento normal para las lecturas de archivos, incluso si el archivo es una tubería con nombre.tail
con el-f
indicador (seguir) se seguirá leyendo desde un archivo una vez que se llegue a su fin.fuente
echo "print \"Hello World\" " > p1
en la segunda terminal y no pasó nada, pero la terminal tampoco estaba bloqueada. El terminal con Python permaneció bloqueado hasta que^c
lo cerré y salí y terminé Python con un mensaje de interrupción de teclado que Python muestra.tail -f
truco al descomprimir el archivo tar dividido en bloques a través de una tubería con nombre. Funcionó maravillosamente.Debe enviar todo el programa a la vez.
Cuando llama a ejecutar,
python < p1
el shell está esperando la entrada antes de invocar python. Es decir, Python ni siquiera comienza a ejecutarse en absoluto hasta que el shell ha leído todo el flujo de datos y luego se lo pasa en su totalidad apython
.Incluso si se ejecuta en su
python -u p1
lugar (es decir, sin búfer y leído desde un archivop1
)python
intentará leer todo el archivo antes de ejecutarlo.Prueba este experimento.
Terminal 1:
Terminal 2:
Verá que puede enviar varias líneas, pero Python en el Término 1 no hace nada. Ahora presiona ctrl+ D. Todo el programa se ejecuta a la vez.
Entonces, para resumir, si desea que Python lea desde una tubería, debe enviar todo el programa. No puedes usar Python de manera interactiva de esta manera.
fuente
Quizás el enfoque de cola es mejor (más flexible) pero como alternativa:
fuente
-n
podría haber sido eliminado. Y después de eso, 0. El terminal con elecho
comando se bloquea 1. python no ejecuta el comando hasta que presiono^c
elecho
terminal y ambos procesos finalizan.