为何Popen执行'ping URL'调用communicate()在Windows正常但Ubuntu卡住
问题原因
差异来自Windows和Ubuntu中ping命令的默认行为不同,和Python本身无关:
- Windows自带的
ping命令默认仅发送4个ICMP请求包,发送完成后进程会自动终止,因此subprocess.communicate()可以快速读取到进程退出后的所有输出,正常返回结果。 - Ubuntu(以及绝大多数Linux发行版)的
ping命令默认会持续发送ICMP请求,直到收到用户手动终止的信号(如Ctrl+C),所以代码会一直卡在process.communicate()步骤等待ping进程退出,表现为程序挂起无输出。
修复方案
如果要让代码在两个系统都正常运行,只需要给ping命令加上指定请求次数的参数即可:
- Windows下用
-n参数指定发包次数 - Linux/Ubuntu下用
-c参数指定发包次数
兼容两个平台的示例代码如下:
import subprocess import sys # 按系统类型匹配ping参数 if sys.platform == "win32": ARGS = ["ping", "-n", "4", "google.com"] else: ARGS = ["ping", "-c", "4", "google.com"] process = subprocess.Popen(ARGS, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 同时捕获标准输出和标准错误,避免异常场景下输出异常 data = process.communicate() print(data)
内容的提问来源于stack exchange,提问作者ibarbylev
相关产品推荐
相关产品推荐

