为什么 Popen('ping URL').communicate() 在 Windows 中有效而在 Ubuntu 中无效?

Why Popen('ping URL').communicate() works in Windows and doesn't work in Ubuntu?

我尝试 运行 Ubuntu 上的代码,它在 Windows 中有效:

import subprocess 

ARGS = ["ping", "google.com"]
process = subprocess.Popen(ARGS, stdout=subprocess.PIPE)

data = process.communicate()
print(data)

当运行 在Windows 下时,此代码打印出ping 包的元组。但是 Ubuntu 上的相同代码 运行ning 只是挂起,没有别的!

谁能给我解释一下为什么?

大多数平台上 ping 的默认行为是永远发送更多数据包。这看起来像是“挂起”,因为您的 Python 代码正在等待子进程完成,但它永远不会(尽管最终您将用缓冲输出填满内存)。

您想添加一个选项来限制数据包的数量,例如

result = subprocess.run(
    ['ping', '-c', '4', 'google.com'],
    capture_output=True, check=True, text=True)
data = result.stdout

另请注意 subprocess.run() 优先于较低级别的 Popen 函数。与 the documentation already tells you, 一样,如果可以避免,您不想自己管理 Popen 对象。

在 Windows 上测试后,我看到 Windows 中的 ping 发送了 4 个数据包并停止。另一方面,ping 在 Ubuntu 中发送无限数据包,直到退出程序。

process.communicate() 命令将等待文件结束 (EOF) 信号,显然它会在 Windows 中到达,但不会在 Ubuntu 中到达.解决方案是使 Ubuntu 中的 ping 终止。您可以使用 -c 标志限制 ping 发送的数据包数量。做 ARGS = ["ping", "-c", "4", "google.com"] 应该让你的程序打印发送 4 个数据包的结果。