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

使用requests.get下载文件触发WinError 10013权限错误,该如何解决?

问题描述

使用Python的requests模块下载文件,代码如下:

self.proxy = {"http_proxy": "...", "https_proxy": "..."}
request = requests.get(
                file_url,
                allow_redirects=True,
                proxies=self.proxy,
                timeout=30
            )

运行后出现权限错误:

Traceback (most recent call last):
  File "D:\MyPrograms\python_virtual_envs\3.10.5\lib\site-packages\urllib3\connection.py", line 174, in _new_conn
    conn = connection.create_connection(
  File "D:\MyPrograms\python_virtual_envs\3.10.5\lib\site-packages\urllib3\util\connection.py", line 95, in create_connection
    raise err
  File "D:\MyPrograms\python_virtual_envs\3.10.5\lib\site-packages\urllib3\util\connection.py", line 85, in create_connection
    sock.connect(sa)
PermissionError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions

但同一台电脑的Gitbash中,用wget设置相同代理可正常下载:

export http_proxy=...
export https_proxy=...
wget file_url
...                         0%[>                ]   7.49M  2.26MB/s    eta 6m 56s

已排除杀毒软件/防火墙拦截,无Python联网拦截记录,求解决方法。

解决方法
  • 修正代理字典键名:requests要求代理字典的键名为http和https,而非http_proxy和https_proxy,修改后代码:
    self.proxy = {"http": "...", "https": "..."}
    request = requests.get(
                    file_url,
                    allow_redirects=True,
                    proxies=self.proxy,
                    timeout=30
                )
    
  • 读取系统环境变量代理:既然Gitbash中的环境变量生效,可让requests自动读取系统代理,无需手动传入proxies参数,简化代码:
    request = requests.get(
                    file_url,
                    allow_redirects=True,
                    timeout=30
                )
    
    注意:如果是在IDE中运行,可能需要重启IDE让环境变量生效。
  • 检查代理地址格式:确认代理地址包含完整协议头(如http://xxx.xxx.xxx.xxx:port),requests对格式的要求比wget更严格,遗漏协议头会导致连接失败。
  • 以管理员身份运行程序:部分Windows环境下,普通用户权限可能无法创建特定端口的socket,右键Python脚本或IDE选择“以管理员身份运行”测试。
  • 调整连接适配器设置:通过Session对象配置重试策略,避免因临时连接问题触发权限错误,示例代码:
    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    session = requests.Session()
    retry = Retry(total=3, backoff_factor=1)
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    self.proxy = {"http": "...", "https": "..."}
    request = session.get(
                    file_url,
                    allow_redirects=True,
                    proxies=self.proxy,
                    timeout=30
                )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:31