Python - subprocess.Popen 不返回输出

标签 python linux windows-7

我现在使用的是 Windows 7 机器,安装了 STS 和用于 python 开发的 PyDev 实用程序。

我的代码想要登录到一台机器并返回输出。我当前的代码是:

        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 并在列表中正确拆分命令/参数,如下所示:

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

或像这样的字符串中的 quick&dirty(你必须处理引号,但这里没有):

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

但不是这样的:

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

否则实际发出的命令是 "uname -a"(字面意思)。当然,它不存在,应该抛出异常,但由于您使用的是 shell=True 它不存在,因为它在 shell 中运行不存在的命令(它存在,所以 subprocess 不提示)

这就是为什么你不应该在没有绝对强制(例如运行 shell 内部命令)的情况下抛出 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 模块(os.name 产生 nt for instance for windows) and the platform module, 你可以在其中获取系统架构、linux 分布等...

关于Python - subprocess.Popen 不返回输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43396777/

相关文章:

python - 当断点位于 while 循环内时,在 VSCode 中调试 jupyter 笔记本时出错

javascript - 从 JavaScript 函数运行 Python 脚本

linux - Puppet 创建的 Ubuntu 用户无法通过 SSH 连接

linux - 实现自定义传输协议(protocol) - Linux 内核

linux - 用户空间和内核之间的时间不同步

java.net.SocketException : Unrecognized Windows Sockets error: 0: JVM_Bind (JBOSS)

c++ - 将 C++ 应用程序从 XP 移植到 Vista/7

java - 自 java 6.31 : Cannot find the class file for java. lang.Enum 起,eclipse 就损坏了

python - 有没有办法防止 VSC 中的自动格式化程序更改某些行/代码段?

python - 操作和打印 python 字典中的项目