繁体   English   中英

python子进程communication()块

[英]python subprocess communicate() block

我正在使用进程模块调用外部程序(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在运行plink.exe ; 但我需要在子进程终止之前读取输出。 反正有吗?

communicate方法的全部目的是等待进程完成并返回所有输出。 如果您不想等,请不要致电communicate 而是从stdoutstderr属性读取以读取输出。

如果进程输出到stdoutstderr (并且你想单独读取它),你必须小心实际读取它们而不阻塞,或者你可以死锁。 这在Windows上相当困难,您可能希望使用pexpect模块。

我遇到了类似的情况,我必须执行单个命令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())

也许因为“plink.exe”需要接受输入参数,如果你没有传递它们,它会阻塞直到给出数据,你可以尝试在方法中添加参数communicate(input)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM