为什么 Popen('ping URL').communication() 在 Windows 中工作,而在 Ubuntu 中不起作用?



我试着在Ubuntu上运行代码,它在Windows:中运行

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

当在Windows下运行时,此代码会打印出ping包的元组。但是在Ubuntu上运行的同一个代码只是挂起了,其他什么都没有!

有人能向我解释一下原因吗?

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

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

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

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

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

请注意,与较低级别的Popen函数相比,使用subprocess.run()更为可取。就像文档已经告诉你的那样,如果你能避免Popen对象,你就不想自己管理它

相关内容

  • 没有找到相关文章

最新更新