python子进程communicate()b

2024-04-28 19:59:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用子流程模块调用外部程序(plink.exe)登录到服务器;但是当我调用communicate读取输出时,它被阻塞了。代码如下:

 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它仍在运行;但是我需要在子进程终止之前读取输出。有什么办法吗?


Tags: 模块代码import程序服务器hello流程process
3条回答

可能是因为“plink.exe”需要接受输入参数,如果不传递它们,它将阻塞直到给出数据,您可以尝试在方法communicate(input)中添加参数

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

如果进程同时输出到stdoutstderr(并且您希望单独读取它),则必须小心实际读取这两个进程而不阻塞,否则可能会死锁。这在Windows上相当困难,您可能希望改用^{}模块。

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

相关问题 更多 >