То, что я пытаюсь сделать, это запустить python в окне терминала и перенаправить его stdin из именованного канала. Затем я пишу в именованный канал в другом терминале и выполняю эту команду на python.
Терминал 1:
mkfifo p1
python < p1
Терминал 2:
echo -n "print \"Hello World\"" > p1
Что происходит, - Python печатает Hello World
и выходит. Я хочу, чтобы Python работал и выполнял следующую команду. Как мне это сделать в оболочке?
exec 3> p1
делает и что такое&3
&exec 3> &1
? Спасибо.exec 3>&-
работать так же, какexec 3>&1
здесь?3>&-
здесь.3>&1
будет работать, но мало смысла. СпасибоВы можете использовать,
tail -f
чтобы держать fifo открытым послеecho
записи в него.Почему это работает
python
читает отp1
. Когда он достигает конца файла, он перестает читать. Это нормальное поведение для чтения файла, даже если файл является именованным каналом.tail
с-f
флагом (follow) будет продолжать чтение из файла после достижения его конца.источник
echo "print \"Hello World\" " > p1
во втором терминале, и ничего не случилось - но терминал также не был заблокирован. Терминал с python оставался заблокированным до тех пор, пока я^c
не выйду из него и не завершу работу python с сообщением о прерывании клавиатуры, отображаемым python.tail -f
трюк при распаковке архива tar с разделением на блоки по именованному каналу. Это сработало чудесно.Вам необходимо отправить всю программу сразу.
Когда вы вызываете run,
python < p1
оболочка ожидает ввода перед вызовом python. То есть, питон не даже начать выполнение на всех , пока весь поток данных не считан оболочкой , а затем передается в полном объеме вpython
.Даже при запуске
python -u p1
вместо этого (то есть без буферизации и чтения из файлаp1
)python
будет пытаться прочитать весь файл, прежде чем он выполнит какой-либо из них.Попробуйте этот эксперимент.
Терминал 1:
Терминал 2:
Вы увидите, что можете отправлять несколько строк, но Python в термине 1 ничего не делает. Теперь нажмите ctrl+ D. Вся программа выполняется сразу.
Итак, подведем итог: если вы хотите, чтобы python читал из канала, вам нужно отправить всю программу. Вы не можете использовать Python в интерактивном режиме таким образом.
источник
Может быть, хвостовой подход лучше (более гибкий), но в качестве альтернативы:
источник
-n
может быть, о будет удален. И после этого 0. Терминал сecho
командой блокируется 1. Python не выполняет команду, пока я не нажму^c
вecho
терминале и оба процесса не завершатся.