Поддерживать подпроцесс и давать ему команды?питон - PullRequest
9 голосов
/ 17 февраля 2012

Если я создаю новый subprocess в python с помощью данной команды (скажем, я запускаю интерпретатор python с помощью команды python), как я могу отправить новые данные процессу (через STDIN)?

Ответы [ 3 ]

11 голосов
/ 17 февраля 2012

Используйте стандартный модуль подпроцесс . Вы используете subprocess.Popen (), чтобы запустить процесс, и он будет работать в фоновом режиме (то есть одновременно с вашей программой на Python). Когда вы вызываете Popen (), вы, вероятно, захотите установить для параметров stdin, stdout и stderr значение subprocess.PIPE. Затем вы можете использовать поля stdin, stdout и stderr возвращаемого объекта для записи и чтения данных.

Не проверенный пример кода:

from subprocess import Popen, PIPE

# Run "cat", which is a simple Linux program that prints it's input.
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE)
process.stdin.write(b'Hello\n')
process.stdin.flush()
print(repr(process.stdout.readline())) # Should print 'Hello\n'
process.stdin.write(b'World\n')
process.stdin.flush()  
print(repr(process.stdout.readline())) # Should print 'World\n'

# "cat" will exit when you close stdin.  (Not all programs do this!)
process.stdin.close()
print('Waiting for cat to exit')
process.wait()
print('cat finished with return code %d' % process.returncode)
3 голосов
/ 17 февраля 2012

Не.

Если вы хотите отправить команды подпроцессу, создайте pty, а затем разветвите подпроцесс с одним концом pty, подключенным к его STDIN.

Вот фрагмент из моего кода:

RNULL = open('/dev/null', 'r')
WNULL = open('/dev/null', 'w')

master, slave = pty.openpty()
print parsedCmd
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL,
                      stdout=WNULL, stderr=slave)

В этом коде pty подключен к stderr, потому что он получает сообщения об ошибках, а не отправляет команды, но принцип тот же.

0 голосов
/ 17 февраля 2012

Туннель, созданный подпроцессом для запуска нескольких команд, нельзя сохранить живым. для достижения этой цели вы можете обратиться к paramiko, для других вещей, таких как подпроцесс stdin, stdout, stderr, вы можете перейти по этой ссылке подпроцесс python , так как это ваш первый проект на Python, лучше его прочесть и опробовать .

...