记录一次用Ubuntu使用代理后无法安装Python包的问题

记录一次用Ubuntu使用代理后无法安装Python包的问题

首先使用Ubuntu系统,我使用了Clash-verge代理,
想要执行alpha download-bundle命令,报错

When I running the "rqalpha download-bundle", something happened.
try [http://bundle.assets.ricequant.com/bundles\_v4/rqbundle\_202509.tar.bz2](http://bundle.assets.ricequant.com/bundles_v4/rqbundle_202509.tar.bz2) ...
Traceback (most recent call last):
File "/data/miniconda3/envs/rqalpha/bin/rqalpha", line 8, in <module>
sys.exit(entry\_point())
^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/rqalpha/**main**.py", line 23, in entry\_point
cli(obj={})
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/click/core.py", line 1442, in **call**
return self.main(\*args, \*\*kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/click/core.py", line 1363, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/click/core.py", line 1830, in invoke
return \_process\_result(sub\_ctx.command.invoke(sub\_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/click/core.py", line 1226, in invoke
return ctx.invoke(self.callback, \*\*ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/click/core.py", line 794, in invoke
return callback(\*args, \*\*kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/rqalpha/cmds/bundle.py", line 116, in download\_bundle
url, total\_length = get\_exactly\_url()
^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/rqalpha/cmds/bundle.py", line 145, in get\_exactly\_url
r = requests.get(url, stream=True, proxies={'http': proxy\_uri, 'https': proxy\_uri})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/api.py", line 73, in get
return request("get", url, params=params, \*\*kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/api.py", line 59, in request
return session.request(method=method, url=url, \*\*kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/sessions.py", line 589, in request
resp = self.send(prep, \*\*send\_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/sessions.py", line 703, in send
r = adapter.send(request, \*\*kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/adapters.py", line 610, in send
conn = self.get\_connection\_with\_tls\_context(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/adapters.py", line 460, in get\_connection\_with\_tls\_context
proxy\_manager = self.proxy\_manager\_for(proxy)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/requests/adapters.py", line 258, in proxy\_manager\_for
manager = self.proxy\_manager\[proxy] = SOCKSProxyManager(
^^^^^^^^^^^^^^^^^^
File "/data/miniconda3/envs/rqalpha/lib/python3.11/site-packages/urllib3/contrib/socks.py", line 212, in **init**
raise ValueError(f"Unable to determine SOCKS version from {proxy\_url}")
ValueError: Unable to determine SOCKS version from socks\://127.0.0.1:7897/

这个报错的根因很清楚:requests/urllib3 读到了一个 不带版本前缀的 SOCKS 代理地址——socks://127.0.0.1:7897/
urllib3.contrib.socks.SOCKSProxyManager 需要明确是 socks5://socks5h://(或 socks4://),否则就会抛出你看到的:

ValueError: Unable to determine SOCKS version from socks://127.0.0.1:7897/

下面给出几种稳定可复现的修复路径(任选其一即可),并附带验证方法。


我的办法

  1. 首先我关闭代理
  2. 使用env | grep -i proxy命令,看输出中all_proxy等字段时候已经确实socket的前缀
  3. 我发现还是没有确认,于是我使用unset all_proxy命令
  4. 再次使用env | grep -i proxy命令,发现已经不输出all_proxy字段
  5. 于是我再次下载或者安装,不会报错

快速修复(推荐顺序)

方案 A:临时关闭代理后再下载 bundle(最省心)

适合你当前网络直接能访问 rqalpha 的 bundle 源。

# 仅对本次终端会话/命令生效(Linux/macOS Bash/Zsh)
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

# 再执行
rqalpha download-bundle
# 或
rqalpha update-bundle

仅想对单条命令禁用代理(不改动会话环境变量):

env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY rqalpha download-bundle

Windows PowerShell(当前会话):

Remove-Item Env:http_proxy, Env:https_proxy, Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:ALL_PROXY -ErrorAction SilentlyContinue
rqalpha download-bundle

方案 B:把代理写成 正确的 SOCKS 前缀

如果你必须走本地/公司代理(常见于科学/公司内网),请把所有相关环境变量从 socks://... 改成 socks5h://...(或 socks5://...h 代表让代理端解析域名,通常更稳)。

# Linux/macOS Bash/Zsh
export http_proxy="socks5h://127.0.0.1:7897"
export https_proxy="socks5h://127.0.0.1:7897"
export ALL_PROXY="socks5h://127.0.0.1:7897"

# 可选:白名单直连域(示例)
export NO_PROXY="localhost,127.0.0.1,*.local"
# 然后再跑:
rqalpha download-bundle

Windows PowerShell(当前会话):

$env:http_proxy = "socks5h://127.0.0.1:7897"
$env:https_proxy = "socks5h://127.0.0.1:7897"
$env:ALL_PROXY = "socks5h://127.0.0.1:7897"
rqalpha download-bundle

注:若你的本地代理实际上是 HTTP 代理(很多客户端对外也提供 HTTP 代理端口),可用 http://127.0.0.1:7897 取代上面的 socks5h://...


方案 C:确保已安装 SOCKS 支持(极少数环境缺这个)

requests 走 SOCKS 需要 PySocks 组件。一般 rqalpha 的依赖会装好,但如果你自建极简环境,可能没带:

pip install "requests[socks]"  # 或者:pip install pysocks

装完按方案 B 设置正确前缀再跑 rqalpha download-bundle


为什么会触发?

rqalpha/cmds/bundle.py 在下载时内部调用了:

requests.get(url, stream=True, proxies={'http': proxy_uri, 'https': proxy_uri})

proxy_uri 来自你的环境变量(如 http_proxy/https_proxy/ALL_PROXY)。
当它拿到 socks://127.0.0.1:7897/ 这种缺版本的 URL,urllib3 无法判断用 SOCKS4 还是 SOCKS5,于是抛错。


建议的验证步骤(可选)

  1. 查看当前会话代理变量:

    env | grep -i proxy
    
  2. 按上面方案 A 或 B 调整后,再次确认变量已生效。

  3. 试跑:

    rqalpha download-bundle
    # 或 update-bundle(两者都能拉数据包)
    
  4. 若仍失败,检查是否被公司网关拦截(需要把 bundle.assets.ricequant.com 放入直连白名单,或允许 HTTP 流量走代理)。


常见变体与排查

  • 只设置了 ALL_PROXY=socks://127.0.0.1:7897:也会触发同样错误。改为 socks5h://...,或改成 HTTP 代理前缀。
  • 只改了 http_proxy 忘了改 https_proxy:HTTPS 仍会报同错,两个都要改。
  • 代理端口不是 7897:请以你的软件实际导出的端口为准(Clash 默认可能是 7890/7891/7897 等)。
  • 想长期生效:把 export ... 写入 ~/.bashrc / ~/.zshrc 或系统环境里;Windows 用“系统环境变量”永久配置。

如果你希望,我可以把你当前的 env | grep -i proxy 输出贴出来,我按你的实际环境给一条精确可复制的修复命令。

这个错误是由于代理设置问题导致的。requests 在通过 SOCKS 代理下载数据时,需要明确是 SOCKS4 还是 SOCKS5。当环境变量中设置了 socks://127.0.0.1:7897/ 这样的地址时,由于缺少版本前缀,urllib3 无法判断应该用哪种 SOCKS 版本,于是抛出了:

ValueError: Unable to determine SOCKS version from socks://127.0.0.1:7897/

以下两种方法可以解决:

  1. 临时关闭代理后再下载
    如果网络可以直接访问 RQAlpha 的 bundle 源,可以在执行下载命令前临时清除代理设置。以 Bash/Zsh 为例:

    unset http_proxy https_proxy ALL_PROXY
    rqalpha download-bundle
    

    或者仅在这一条命令中取消代理:

    env -u http_proxy -u https_proxy -u ALL_PROXY rqalpha download-bundle
    
  2. 正确设置 SOCKS 代理前缀
    如果必须通过代理访问,可以把代理地址中的 socks:// 改成 socks5://socks5h://h 表示让代理端解析域名)。例如:

    export http_proxy="socks5h://127.0.0.1:7897"
    export https_proxy="socks5h://127.0.0.1:7897"
    export ALL_PROXY="socks5h://127.0.0.1:7897"
    
    rqalpha download-bundle
    

    如果代理实际上是 HTTP 代理,则把 socks5h:// 改成 http://

设置正确之后,再运行 rqalpha download-bundlerqalpha update-bundle 应该就能正常下载了。如果仍然出现问题,可以检查当前会话中代理相关的环境变量(env | grep -i proxy)是否已经更新。

posted @ 2025-09-11 11:09  光辉233  阅读(15)  评论(0)    收藏  举报