Как добавить новые команды оболочки в подпроцесс в Python 3.7? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь найти способ добавить команды в стандартный ввод уже открытого процесса оболочки в Python 3.7. Но я не могу найти решение.

Я попробовал несколько решений без удачи.

p1 = subprocess.Popen('pwd > test', shell=True, stdin=PIPE, text=True) # works

p1.communicate('pwd > test1')                                    # doesn't work
p1.communicate(input='pwd > test2')                              # doesn't work
p1.communicate('pwd > test3\n')                                  # doesn't work
p1.stdin.write('pwd > test4')                                    # doesn't work
p1.stdin.write('pwd > test5\n')                                  # doesn't work

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете достичь этого, если ваша команда сама является оболочкой, но не если это команда, которая либо завершает работу (как pwd), либо выполняет команду, которая захватывает stdin как свой собственный ввод. Следующее должно работать - обратите внимание, что вам не нужно shell=True, и что вам нужно грипп sh записи в stdin:

from subprocess import Popen, PIPE

p1 = subprocess.Popen('bash', stdin=PIPE, text=True)

p1.stdin.write("xeyes\n")
p1.stdin.flush()

Вы можете отслеживать это более точно, выполнив, например, :

p1 = subprocess.Popen('pwd', shell=True, stdin=PIPE, text=True)
p1.pid

Затем, глядя на идентификатор процесса в оболочке:

ps -ef |grep <PID>

Вы увидите: sh <defunct>, который показывает, что процесс мертв и больше не доступен для связи (но все равно обнаруживается, поскольку python содержит ссылку на него, которая исчезает при выходе из python).

Если вы попытаетесь написать в stdin, вы получите:

BrokenPipeError: [Errno 32] Разбитая труба

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...