Получение stdin от именованного канала

Это - hardcoded, но можно переопределить значения по умолчанию параметром ядра init=....

От init/main.c:

if (execute_command) {
  run_init_process(execute_command);
  printk(KERN_WARNING "Failed to execute %s.  Attempting "
        "defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

panic("No init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");
10
19.04.2013, 06:15
4 ответа

Вы должны

  • Запущенный Python в интерактивном режиме даже при том, что его stdin не является терминалом: использовать python -i
  • сохраните конец записи канала открытым, иначе Python обнаружит EOF и выход.

Так:

python -i < p1

И в другом месте:

exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-
10
27.01.2020, 20:01
  • 1
    Спасибо! Это работало. Я не знаком с тем, что Вы сделали. Добавьте некоторые детали к своему ответу для объяснения, что продолжается. Что exec 3> p1 выполнение и что &3 & exec 3> &1?Спасибо. –  Lord Loh. 19.04.2013, 21:15
  • 2
    Ваш ответ напомнил мне об этом баннере - sphotos-b.xx.fbcdn.net/hphotos-ash4 / … это рис. покрытия друга в Facebook :-) –  Lord Loh. 19.04.2013, 21:18
  • 3
    вопрос, был бы exec 3>&- работайте то же как exec 3>&1 здесь? –  Wildcard 19.04.2016, 05:29
  • 4
    @Wildcard, я подозреваю, что намеревался записать 3>&- здесь. 3>&1 работал бы также, но имел бы мало смысла. Спасибо –  Stéphane Chazelas 19.04.2016, 08:39

Можно использовать tail -f сохранять FIFO открытым после echo записи к нему.

tail -n1 -f p1 | python

Почему это работает

python читает из p1. Когда это достигает конца файла, это прекращает читать. Это - нормальное поведение для чтений файла, даже если файл является именованным каналом. tail с -f (следуйте) флаг будет продолжать читать из файла после того, как его конец будет достигнут.

5
27.01.2020, 20:01
  • 1
    я попробовал echo "print \"Hello World\" " > p1 во втором терминале и ничего не произошло - но терминал не был заблокирован также. Терминал с Python остался заблокированным пока я ^c это и выход это и оконечный Python с клавиатурой прерывает сообщение, отображаемое Python. –  Lord Loh. 19.04.2013, 06:26
  • 2
    , я использовал это tail -f обманите при распаковке разделенного на блок архива tar через именованный канал. Это работало замечательно. –  Mael 14.10.2017, 16:39

Необходимо отправить всю программу сразу.

Когда Вы называете выполненными python < p1 оболочка ожидает входа прежде, чем вызвать Python. Таким образом, Python даже не начинает выполняться вообще, пока весь поток данных не был считан оболочкой и затем передается в целом python.

Даже выполнение python -u p1 вместо этого (то есть, освободил буфер, и читайте из файла p1) python попытается считать весь файл, прежде чем он выполнит любой из него.

Попробуйте этот эксперимент.

Терминал 1:

mkfifo p1
python < p1

Терминал 2:

cat > p1
print "Hello World"
print "Hello World"

Вы будете видеть, что можно отправить несколько строк, но Python в Термине 1 ничего не делает. Теперь нажмите ctrl+D. Вся программа выполняется сразу.

Так, для суммирования если Вы хотите, чтобы Python читал из канала, необходимо отправить всю программу. Вы не можете использовать Python в интерактивном режиме этот путь.

2
27.01.2020, 20:01

Возможно, подход хвоста лучше (более гибок), но как альтернатива:

{ echo -n "print \"Hello World\""; cat; } > p1
1
27.01.2020, 20:01
  • 1
    Это не работает, как я хочу. -n мог бы иметь o быть удаленным. И после этого, 0. Терминал с echo команда становится заблокированной 1. Python не выполняет команду, пока я не нажимаю ^c в echo терминал и оба оконечные процесса. –  Lord Loh. 19.04.2013, 06:23
  • 2
    @LordLoh. Может быть проблема буферизации. Вероятно, Python выполнит команду, если достаточно вывода было создано так, чтобы первая строка наконец была записана в FIFO. Но как существует рабочее решение, не имело бы смысла прикладывать усилия к решению этой проблемы. –  Hauke Laging 19.04.2013, 06:51

Теги

Похожие вопросы