You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:36:04