Python - subprocess.Popen没有返回输出

时间:2017-04-13 15:54:45

标签: python linux windows-7

我正在使用Windows 7机器,现在已经安装了使用PyDev实用程序进行python开发的STS。

我的代码想要登录到计算机并返回输出。我目前的代码是:

        ssh = subprocess.Popen(["uname -a"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        print (ssh)
        result = ssh.stdout.readlines()
        print (result)

这引起了输出:

<subprocess.Popen object at 0x02B35810>
[]

但是uname -a命令应该产生Linux 3.10.0-514.10.2.el7.x86_64 #1 SMP Mon Feb 20 02:37:52 EST 2017 x86_64 x86_64 x86_64 GNU/Linux

知道为什么我不能捕获输出吗?

1 个答案:

答案 0 :(得分:0)

您可以使用命令/ args调用$(ui).on('click', node, function(){ window.open("/.../.../"+node.id.toLowerCase()); }); 在这样的列表中正确拆分:

uname

或像这样快速和肮脏的字符串(你必须处理引用,但这里没有):

subprocess.Popen(["uname","-a"] ...

但不是这样的:

subprocess.Popen("uname -a", ...

否则实际发出的命令是subprocess.Popen(["uname -a"] ... (字面意思)。当然,它不存在,应该抛出异常,但是因为你使用"uname -a"它不会因为它在shell中运行不存在的命令(存在,所以shell=True并不抱怨)

这是为什么你不应该在不被绝对强迫(例如运行shell内部命令)的情况下抛出subprocess的众多原因之一

检查错误流(使用shell=True)会显示result = ssh.stderr.readlines()

之类的内容

请注意,对输出和错误流使用"uname -a": command not found可能会导致死锁,除非您在内部使用PIPE处理单独线程中的流。

我对您的问题的建议只是使用ssh.communicate(),因为您不需要在后台运行该命令,您只需要输出:

check_output

(略有不同,因为它不会创建行而是唯一的缓冲区,您可以轻松地将result = subprocess.check_output(["uname","-a"]) / strip应用到<)

请注意,如果您正在寻找可移植的方式来获取系统类型或平台,我建议您splitline模块(例如os为{1}}生成os.name以及nt模块,您可以在其中获得系统架构,Linux分发等......