Подпроцесс Python блок связи () - PullRequest
15 голосов
/ 25 января 2010

Я использую модуль подпроцесс для вызова внешней программы (plink.exe) для входа на сервер; но когда я звоню общаться, чтобы прочитать вывод, он блокирует. Код ниже:

 import subprocess
 process = subprocess.Popen('plink.exe hello@10.120.139.170 -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 print process.communicate() #block here

Я знаю, что блок - потому что plink.exe он все еще работает; но мне нужно прочитать вывод до завершения подпроцесса. Есть ли в любом случае, чтобы сделать это?

Ответы [ 3 ]

26 голосов
/ 25 января 2010

Цель метода communicate состоит в том, чтобы дождаться завершения процесса и вернуть все выходные данные. Если вы не хотите ждать, не звоните communicate. Вместо этого читайте из атрибута stdout или stderr, чтобы прочитать вывод.

Если процесс выводит как stdout, так и stderr (и вы хотите прочитать его отдельно), вам нужно быть осторожным, чтобы фактически прочитать оба без блокировки, или вы можете заблокировать. Это довольно сложно для Windows, и вы можете использовать вместо этого модуль pexpect.

0 голосов
/ 22 октября 2018

Возможно, из-за того, что plink.exe должен принимать входные аргументы, если вы не передадите их, он будет блокироваться до тех пор, пока не будут переданы данные, вы можете попробовать добавить аргументы в методе communicate(input)

0 голосов
/ 11 декабря 2012

Я столкнулся с подобной ситуацией, когда мне пришлось выполнить одну команду lmstat -a и затем получить вывод терминала.

Если вам просто нужно запустить одну команду и затем прочитать вывод, вы можете использовать следующий код:

import subprocess

Username = 'your_username'
Password = 'your_password'
IP = 'IP_of_system'
Connection_type = '-ssh' #can have values -ssh -telnet -rlogin -raw -serial

p = subprocess.Popen(['plink', Connection_type, '-l', Username, '-pw', Password, IP], \
                     shell = False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = p.communicate('lmstat -a\nexit\n'.encode())
print(out.decode())
...