安装 PyPI3
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3-pip
设置 PyPI 的国内源
python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
sudo python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
升级 PyPI 本身和安装 GenPAC
sudo pip install -U pip
sudo pip install -U genpac
解决“ImportError: cannot import name 'Callable' from 'collections'” 问题
Python 3.12 暂未发现没有这个问题,若是触发了此错误,请使用以下路径 /usr/local/lib/python3.12/dist-packages/genpac/。
此外,另人意外的是,当前(2025-03),Ubuntu 22.04 中的 Python 3.10 也没有发现这个问题。
升级 Callable
sudo pip install -U Callable
修改 GenPAC 相关文件的代码
找到“from collections import Callable”所在文件,然后修改:
find /usr/local/lib/python3.10/dist-packages/genpac/ -type f | grep -E "*.\.py" | xargs grep -n "from collections import Callable"
当前的执行结果是:
/usr/local/lib/python3.10/dist-packages/genpac/pysocks/socks.py:65:from collections import Callable
以上的结果分析得出,搜索的目标字符串在文件 /usr/local/lib/python3.10/dist-packages/genpac/pysocks/socks.py 的第 65 行中。
然后用文本编辑器打开之,这里用 vi 打开:
sudo vi /usr/local/lib/python3.10/dist-packages/genpac/pysocks/socks.py
删除该行,然后在文件原位置添加以下代码:
try:
from collections import Callable
except ImportError:
from collections.abc import Callable
保存并退出文件。
如果还没有解决问题,请参考: https://github.com/JinnLynn/genpac/issues/46。
生成 pac 文件
前提:
切换到任意一个当前系统登录用户有读写运行权限的目录下(这里是当前用户的“家”目录下的 Documents 目录)。
mkdir ~/Documents
cd ~/Documents
# 笔者本地环境中有可访问的 HTTP 代理,其地址和端口是: http://192.168.1.101:8118
# 你可根据实际情况来调整。
genpac --format pac --pac-proxy "SOCKS5 192.168.1.101:1080" --proxy "http://192.168.1.101:8118" --output "autoproxy.pac" --gfwlist-url "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"
如果上面命令中的网址列表 URL 无法访问,可以参考本站的文章: 如何在境内加速 GitHub 资源的下载以及克隆。
于是,可以用以下命令代替上述的命令:
genpac --format pac --pac-proxy "SOCKS5 192.168.1.101:1080" --output "autoproxy.pac" --gfwlist-url "https://raw.kkgithub.com/gfwlist/gfwlist/master/gfwlist.txt"
参数说明:
-
--pac-proxy 指定 PAC 文件中使用的代理信息;
-
--proxy 指定获取远程网址列表文件要使用的代理;
-
--output 指定输出的 PAC 文件的名称;
-
--gfwlist-url 指定网址列表文件的 URL。
若要使用 HTTP 协议的网络代理,把上述命令中的 “SOCKS5” 修改成 “HTTP” 即可,记得同时修改 IP 地址和端口,这是要把网络流量转发到 HTTP 协议的代理中。
GenPAC 允许的具体参数参考: https://github.com/JinnLynn/genpac#user-content-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95。
没有提示即是成功生成 PAC 文件,文件名称为 autoproxy.pac,全路径为 /home/user/Documents/autoproxy.pac,其中,user 为当前登录系统的用户名,假设它为 test,下文会用到。