我试着在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
对象,你就不想自己管理它