Блок связи python subprocess()
Я использую модуль подпроцесса для вызова внешней программы (plink.exe) для входа на сервер; но когда я вызываю сообщение для чтения вывода, он блокирует. Код ниже:
import subprocess
process = subprocess.Popen('plink.exe [email protected] -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate() #block here
Я знаю, что блок - это потому, что plink.exe
он все еще работает; но мне нужно прочитать результат до завершения подпроцесса. Есть ли способ сделать это?
Ответы
Ответ 1
Вся цель метода communicate
состоит в том, чтобы дождаться завершения процесса и возврата всего вывода. Если вы не хотите ждать, не вызывайте communicate
. Вместо этого прочитайте из атрибута stdout
или stderr
, чтобы прочитать результат.
Если процесс выдает как stdout
, так и stderr
(и вы хотите прочитать его отдельно), вам нужно быть осторожным, чтобы действительно читать с обоих без блокировки, или вы можете зайти в тупик. Это довольно сложно для Windows, и вы можете использовать pexpect
.
Ответ 2
Я столкнулся с аналогичной ситуацией, когда мне пришлось выполнить одну команду 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())