为什么 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 个数据包的结果。
我尝试 运行 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 个数据包的结果。