我使用subprocess.Popen实现了一个python程序来执行从服务器到Ubuntu客户端的命令。子进程必须逐行读取所有输出。 我的程序在Eclipse环境中运行良好。所有输出都按我的预期打印。 但是当我在Python交互式shell(在Windows和Linux中)运行程序时,subprocess.Popen没有读取所有命令输出。输出只显示很少,然后Python崩溃没有任何错误。这是我的程序代码:
def execute(self, IP_Instance, command):
keypairs_directory = Config.keypairs_directory
cmd = 'ssh ubuntu@%s'%IP_Instance+' -i %s'%keypairs_directory+' %s'%command
cmd_run = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
for line in cmd_run.stdout:
print line
cmd_run.wait()
例如,当我发送命令时:
a.execute('xxx.xxx.xxx.xxx', 'ls -l')
我有输出
total 0
没关系。但是当我发送时:
a.execute('xxx.xxx.xxx.xxx', 'sudo apt-get update')
该程序只运行到
Fetched 8,364 kB in 6s (1,205 kB/s)
Reading package lists...
然后Python回到
>>>
我曾尝试沟通()[0],民意调查(),但他们没有带来效力。我为所有机器使用Python 2.7。我究竟做错了什么?
答案 0 :(得分:2)
apt-get update
命令也会在标准错误中返回数据,因此您还需要捕获stderr
数据:
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
然后您必须同时使用Popen.stdout
和Popen.stderr
。