记录一次用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/
下面给出几种稳定可复现的修复路径(任选其一即可),并附带验证方法。
我的办法
- 首先我关闭代理
- 使用
env | grep -i proxy
命令,看输出中all_proxy
等字段时候已经确实socket
的前缀 - 我发现还是没有确认,于是我使用
unset all_proxy
命令 - 再次使用
env | grep -i proxy
命令,发现已经不输出all_proxy
字段 - 于是我再次下载或者安装,不会报错
快速修复(推荐顺序)
方案 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,于是抛错。
建议的验证步骤(可选)
-
查看当前会话代理变量:
env | grep -i proxy
-
按上面方案 A 或 B 调整后,再次确认变量已生效。
-
试跑:
rqalpha download-bundle # 或 update-bundle(两者都能拉数据包)
-
若仍失败,检查是否被公司网关拦截(需要把
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/
以下两种方法可以解决:
-
临时关闭代理后再下载
如果网络可以直接访问 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
-
正确设置 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-bundle
或 rqalpha update-bundle
应该就能正常下载了。如果仍然出现问题,可以检查当前会话中代理相关的环境变量(env | grep -i proxy
)是否已经更新。