Блок связи 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())