Ce que j'essaie de faire, c'est d'exécuter python dans une fenêtre de terminal et de rediriger son stdin à partir d'un canal nommé. Ensuite, j'écris dans le canal nommé dans un autre terminal et je fais exécuter cette commande sur python.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
Ce qui se passe, c'est que python imprime Hello World
et quitte. Ce que je veux faire, c'est continuer à exécuter python pour prendre une prochaine commande. Comment faire cela dans le shell?
exec 3> p1
fait-on et qu'est-ce que&3
&exec 3> &1
? Je vous remercie.exec 3>&-
fonctionnerait la même choseexec 3>&1
qu'ici?3>&-
ici.3>&1
fonctionnerait aussi bien mais aurait peu de sens. MerciVous pouvez utiliser
tail -f
pour garder le fifo ouvert après lesecho
écritures.Pourquoi cela fonctionne
python
lit dep1
. Lorsqu'il atteint la fin du fichier, il arrête la lecture. Il s'agit d'un comportement normal pour les lectures de fichiers, même si le fichier est un canal nommé.tail
avec le-f
drapeau (suivre) continuera la lecture d'un fichier une fois sa fin atteinte.la source
echo "print \"Hello World\" " > p1
dans le deuxième terminal et rien ne s'est passé - mais le terminal n'était pas bloqué non plus. Le terminal avec python est resté bloqué jusqu'à ce que je le^c
quitte et le quitte et termine python avec un message d'interruption clavier affiché par python.tail -f
astuce lors du déballage de l'archive tar fractionnée en bloc via un canal nommé. Cela a fonctionné à merveille.Vous devez envoyer le programme entier en une seule fois.
Lorsque vous appelez run,
python < p1
le shell attend une entrée avant d'appeler python. Autrement dit, python ne commence même pas du tout à s'exécuter tant que le flux de données entier n'a pas été lu par le shell, puis transmis dans son intégralité àpython
.Même en exécutant à la
python -u p1
place (c'est-à-dire sans tampon et en lisant à partir du fichierp1
)python
, vous essayez de lire l'intégralité du fichier avant de l'exécuter.Essayez cette expérience.
Terminal 1:
Terminal 2:
Vous verrez que vous pouvez envoyer plusieurs lignes mais python dans Term 1 ne fait rien. Appuyez maintenant sur ctrl+ D. L'ensemble du programme s'exécute simultanément.
Donc, pour résumer, si vous voulez que python lise à partir d'un canal, vous devez envoyer le programme entier. Vous ne pouvez pas utiliser python de manière interactive de cette façon.
la source
Peut-être que l'approche queue est meilleure (plus flexible) mais comme alternative:
la source
-n
pourrait avoir été supprimé. Et après cela, 0. Le terminal avec laecho
commande est bloqué 1. python n'exécute pas la commande jusqu'à ce que j'appuie sur^c
leecho
terminal et que les deux processus se terminent.