在 ubuntu 系統中使用 apt 安裝 python 第三方包版本可能滯后的原因以及如何解決此問題,已經成為許多用戶關注的焦點。讓我們深入探討這個問題,并提供一些解決方案。
為什么 Ubuntu 系統中使用 apt 安裝的 python 第三方包版本會滯后?
在 Ubuntu 系統中,當我們使用 apt 命令來安裝 Python 第三方包時,常常會發現這些包的版本較舊,導致一些兼容性問題。最近,在嘗試使用 certbot 安裝 Let’s Encrypt 證書時,遇到了一些奇怪的錯誤,讓人不禁疑惑:為什么使用 apt 安裝的 Python 第三方包版本會如此滯后?
我的系統環境是 Ubuntu 22.04,并且已經執行了 apt update。在嘗試安裝 certbot 時,我使用了以下命令:
sudo apt install certbot python3-certbot-nginx
然而,在使用 certbot 時卻出現了錯誤:
pon@aliyun2core2GB:~$ sudo certbot certonly --manual --preferred-challenges dns -d xxxxx.cn -d *.xxxxx.cn 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')()) ...... 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)
檢查 certbot 的版本,發現它非常老:
立即學習“Python免費學習筆記(深入)”;
pon@aliyun2core2GB:~$ pip show certbot Name: certbot Version: 1.21.0 Summary: ACME client Home-page: https://github.com/letsencrypt/letsencrypt Author: Certbot Project Author-email: certbot-dev@eff.org License: apache License 2.0 Location: /usr/lib/python3/dist-packages Requires: Required-by:
這引發了一個問題:為什么 Ubuntu 系統中的 apt 包管理器會提供如此舊的 Python 第三方包版本?
經過一番測試和分析,發現 certbot 1.21.0 版本實際上是可以正常工作的,并不是版本不兼容的問題。問題的根源在于之前使用 pip 安裝了 urllib3 這個依賴包。
觀察報錯信息,可以看到 urllib3 的文件路徑在 /usr/local/lib/python3.10/dist-packages,而 certbot 則位于 /usr/lib/python3/dist-packages。這說明:
- 使用 apt install python-xxx 安裝的包會被放置在 /usr/lib/python3/dist-packages 目錄下。
- 使用 sudo pip install xxx 安裝的包會被放置在 /usr/local/lib/python3.10/dist-packages 目錄下。
Python 在加載包時會按照目錄優先級進行搜索,優先級順序如下:
- /usr/local/lib/python3.10/dist-packages
- /usr/lib/python3/dist-packages
因此,當系統中同時存在通過 apt 和 pip 安裝的包時,pip 安裝的包會優先被加載,導致版本沖突。
實際上,apt 已經解決了依賴問題,但 apt 安裝的包優先級較低。為了避免這種情況,正確的做法是:
- 在系統中只使用 apt 進行包管理,不要混用 pip。
- 或者使用虛擬環境來隔離不同的包管理需求。
- 或者完全使用 pip 進行包管理。