Ubuntu 22.04中Certbot启动报错:无法从urllib3.contrib导入appengine
问题描述
运行Certbot时出现导入错误,核心是requests_toolbelt无法从urllib3.contrib导入appengine模块,完整报错如下:
Traceback (most recent call last): File "/usr/lib/python3/dist-packages/requests_toolbelt/_compat.py", line 48, in <module> from requests.packages.urllib3.contrib import appengine as gaecontrib ImportError: cannot import name 'appengine' from 'requests.packages.urllib3.contrib' (/usr/local/lib/python3.10/dist-packages/urllib3/contrib/__init__.py) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/bin/certbot", line 33, in <module> sys.exit(load_entry_point('certbot==1.21.0', 'console_scripts', 'certbot')()) File "/usr/bin/certbot", line 25, in importlib_load_entry_point return next(matches).load() File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load module = import_module(match.group('module')) File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/usr/lib/python3/dist-packages/certbot/main.py", line 2, in <module> from certbot._internal import main as internal_main File "/usr/lib/python3/dist-packages/certbot/_internal/main.py", line 28, in <module> from certbot._internal import account File "/usr/lib/python3/dist-packages/certbot/_internal/account.py", line 19, in <module> from acme.client import ClientBase # pylint: disable=unused-import File "/usr/lib/python3/dist-packages/acme/client.py", line 34, in <module> from requests_toolbelt.adapters.source import SourceAddressAdapter File "/usr/lib/python3/dist-packages/requests_toolbelt/__init__.py", line 12, in <module> from .adapters import SSLAdapter, SourceAddressAdapter File "/usr/lib/python3/dist-packages/requests_toolbelt/adapters/__init__.py", line 12, in <module> from .ssl import SSLAdapter File "/usr/lib/python3/dist-packages/requests_toolbelt/adapters/ssl.py", line 16, in <module> from .._compat import poolmanager File "/usr/lib/python3/dist-packages/requests_toolbelt/_compat.py", line 50, in <module> from urllib3.contrib import appengine as gaecontrib ImportError: cannot import name 'appengine' from 'urllib3.contrib' (/usr/local/lib/python3.10/dist-packages/urllib3/contrib/__init__.py)
原因分析
urllib3 2.x版本移除了urllib3.contrib.appengine模块,而系统中安装的requests-toolbelt版本较旧,仍依赖这个已被移除的模块。同时系统存在两个urllib3版本:系统自带版本(/usr/lib/python3/dist-packages)和手动安装的高版本(/usr/local/lib/python3.10/dist-packages),导致Certbot调用时加载了高版本urllib3,引发冲突。
解决方案
方案1:降级urllib3到兼容版本
执行命令降级urllib3到保留appengine模块的1.x版本:
sudo pip3 install urllib3==1.26.15
验证版本:
pip3 show urllib3
确认版本为1.x系列后,重新运行Certbot测试。
方案2:更新requests-toolbelt到兼容版本
若不想降级urllib3,可更新requests-toolbelt到修复了该导入问题的版本:
sudo pip3 install --upgrade requests-toolbelt
新版本已移除对urllib3.contrib.appengine的依赖,适配urllib3 2.x。
方案3:使用Certbot的snap包(推荐)
Ubuntu系统推荐通过snap安装Certbot,避免系统Python包冲突:
- 卸载系统中的Certbot:
sudo apt remove certbot sudo apt autoremove
- 安装snap版Certbot:
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
该方式使用独立环境运行Certbot,完全隔离系统Python包,从根源避免依赖冲突。
内容的提问来源于stack exchange,提问作者Rene
相关产品推荐
相关产品推荐

