Python - subprocess.Popen 不返回输出
Python - subprocess.Popen not returning output
我正在使用 Windows 7 台机器,现在已经安装了 PyDev 实用程序的 STS 用于 python 开发。
我的代码想要登录到一台机器并 return 输出。我当前的代码是:
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
知道为什么我无法捕获输出吗?
您可以调用 uname
并 command/args 正确拆分为这样的列表:
subprocess.Popen(["uname","-a"] ...
或像这样的字符串中的 quick&dirty(你必须处理引号,但这里有 none):
subprocess.Popen("uname -a", ...
但不是这样的:
subprocess.Popen(["uname -a"] ...
否则实际发出的命令是"uname -a"
(字面意思)。当然,它不存在,应该抛出异常,但由于您正在使用 shell=True
它不存在,因为它 运行 是 none 中的 [=] 现有命令54=](存在,所以 subprocess
不会抱怨)
这就是为什么你不应该在没有绝对强迫的情况下扔 shell=True
的众多原因之一(例如 运行 一个 shell 内部命令)
检查错误流(使用 result = ssh.stderr.readlines()
)会发现类似 "uname -a": command not found
的内容
请注意,对输出流和错误流使用 PIPE
可能会导致死锁,除非您使用 ssh.communicate()
在内部单独的线程中处理流。
我对你的问题的建议是简单地使用 check_output
因为你不需要在后台 运行 命令,你只需要它的输出:
result = subprocess.check_output(["uname","-a"])
(略有不同,因为它不创建行,而是创建一个单独的缓冲区,您可以轻松地将 strip
/splitline
应用到)
请注意,如果您正在寻找一种可移植的方式来获取系统类型或平台,我建议您使用 os
模块(os.name
为 [=51= 生成 nt
] 例如)和 platform
模块,您可以在其中获得系统架构、linux 分布等...
我正在使用 Windows 7 台机器,现在已经安装了 PyDev 实用程序的 STS 用于 python 开发。
我的代码想要登录到一台机器并 return 输出。我当前的代码是:
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
知道为什么我无法捕获输出吗?
您可以调用 uname
并 command/args 正确拆分为这样的列表:
subprocess.Popen(["uname","-a"] ...
或像这样的字符串中的 quick&dirty(你必须处理引号,但这里有 none):
subprocess.Popen("uname -a", ...
但不是这样的:
subprocess.Popen(["uname -a"] ...
否则实际发出的命令是"uname -a"
(字面意思)。当然,它不存在,应该抛出异常,但由于您正在使用 shell=True
它不存在,因为它 运行 是 none 中的 [=] 现有命令54=](存在,所以 subprocess
不会抱怨)
这就是为什么你不应该在没有绝对强迫的情况下扔 shell=True
的众多原因之一(例如 运行 一个 shell 内部命令)
检查错误流(使用 result = ssh.stderr.readlines()
)会发现类似 "uname -a": command not found
请注意,对输出流和错误流使用 PIPE
可能会导致死锁,除非您使用 ssh.communicate()
在内部单独的线程中处理流。
我对你的问题的建议是简单地使用 check_output
因为你不需要在后台 运行 命令,你只需要它的输出:
result = subprocess.check_output(["uname","-a"])
(略有不同,因为它不创建行,而是创建一个单独的缓冲区,您可以轻松地将 strip
/splitline
应用到)
请注意,如果您正在寻找一种可移植的方式来获取系统类型或平台,我建议您使用 os
模块(os.name
为 [=51= 生成 nt
] 例如)和 platform
模块,您可以在其中获得系统架构、linux 分布等...