Python Subprocess无法读取shell中的所有输出

时间:2012-11-02 09:37:18

标签: python shell ide subprocess popen

我使用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。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

apt-get update命令也会在标准错误中返回数据,因此您还需要捕获stderr数据:

subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

然后您必须同时使用Popen.stdoutPopen.stderr