Как передать управление подпроцессом в обычный stdin после использования канала? - PullRequest
0 голосов
/ 14 ноября 2018

Что я хотел бы сделать, так это в Python программно отправить несколько начальных команд через stdin процессу, а затем передать ввод пользователю, чтобы впоследствии он мог контролировать программу.Программа Python должна просто ждать, пока подпроцесс завершится из-за пользовательского ввода.По сути, я хочу сделать что-то вроде:

import subprocess

p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)

# Send initial commands.
p.stdin.write(b"three\ninitial\ncommands\n")
p.stdin.flush()

# Give over control to the user.
# …Although stdin can't simply be reassigned
# in post like this, it seems.
p.stdin = sys.stdin

# Wait for the subprocess to finish.
p.wait()

Как я могу передать стандартный ввод пользователю (без использования raw_input, так как мне нуженвводимые пользователем данные вступают в силу при каждом нажатии клавиши, а не только после нажатия клавиши ввода)?

1 Ответ

0 голосов
/ 14 ноября 2018

К сожалению, не существует стандартного способа соединения вашего собственного стандартного ввода со стандартным вводом какого-либо другого процесса на время этого процесса, кроме чтения с собственного стандартного ввода и записи в этот процесс, если вы выбрали запись в этот процесс.во-первых.

То есть вы можете сделать это:

proc = subprocess.Popen(...)  # no stdin=

и процесс унаследует ваш stdin;или вы можете сделать это:

proc = subprocess.Popen(..., stdin=subprocess.PIPE, ...)

и затем вы предоставите стандартный ввод для этого процесса.Но как только вы выбрали любой его стандартного ввода, вы предоставите все его стандартного ввода, даже если это означает, что вы должны прочитать свой собственный стандартный ввод.

Linuxпредлагает системный вызов splice (документация на man7.org , документация на linux.die.net , Википедия , linux pipe данные из файладескриптор в fifo ), но вам лучше всего использовать фоновый поток для копирования данных.

...