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

Python3下os.system调用wget与urllib.request.urlopen下载的SSL异常差异问题

差异原因说明

1. SSL校验逻辑差异来自wget和urllib的默认配置,和os.system无关

  • 你当前使用的wget版本默认开启严格SSL证书校验:检测到目标站点证书过期、不受信任时会直接终止下载任务,写入空文件,同时输出错误日志到控制台。
    该安全校验逻辑完全由wget自带,和os.system无关,并非os.system的特殊安全机制。
  • 你的Python环境中urllib默认关闭了SSL证书校验:最常见的原因是你的代码中某处(或者依赖的第三方库)全局设置了ssl._create_default_https_context = ssl._create_unverified_context,或者你使用的树莓派定制系统镜像默认修改了urllib的SSL上下文默认规则,导致过期证书也能正常请求,不会触发错误。

注:Python 3.4及以上标准库的urllib默认开启SSL证书校验,你的环境属于被修改后的特殊情况,存在中间人攻击的安全风险。

2. os.system不会抛出Python异常是其自身设计导致

os.system()的作用是启动一个shell进程执行传入的命令,本身只会返回命令的退出状态码(命令执行成功返回0,失败返回非0值),不会捕获外部命令的错误并转换为Python异常。你没有对os.system()的返回值做判断,自然感知不到wget的执行失败。

额外建议

  • 如果需要继续使用wget方案,可以在命令中添加--no-check-certificate参数跳过证书校验,修改后的调用代码为:
os.system(f"wget --no-check-certificate -O {target} {src}")
  • 如果使用urllib方案,建议主动开启SSL校验避免安全风险,示例代码如下:
import ssl
import urllib.request

# 构造开启SSL校验的上下文,使用系统根证书
context = ssl.create_default_context()
with urllib.request.urlopen(src, context=context) as response, open(target, 'wb') as out_file:
    out_file.write(response.read())

内容的提问来源于stack exchange,提问作者ddlab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:27:03