Python版本與package版本兼容性檢查方法總結(jié)

引言
不少同學(xué)在用 Python 建環(huán)境的時(shí)候都會遇到類似的情況:
明明在 conda 或者 venv 里裝好了一個(gè) Python 版本,比如 3.8,結(jié)果一裝包就報(bào)錯(cuò),說 版本不兼容。
一個(gè)典型的例子就是大家經(jīng)常遇到的 cv2 (也就是 opencv-python)。在 Windows 下你可能輸入了:
pip install cv2
結(jié)果直接提示版本不對。那這個(gè)時(shí)候我們該怎么判斷現(xiàn)有 Python 環(huán)境能裝哪個(gè)版本的包呢?這篇文章我們就來聊聊 Python 與包版本兼容性檢查的方法,并且給出一個(gè)可以自己跑的 Demo 腳本。
為什么會出現(xiàn)兼容性問題
Python 的第三方庫其實(shí)都有自己的“適配范圍”。舉個(gè)例子:
某個(gè)庫可能只支持 Python 3.9+
另一個(gè)庫可能只維護(hù)到 Python 3.7
還有的庫雖然支持多個(gè) Python 版本,但只有新版本才能跑新特性
在 pip 安裝的時(shí)候,它會嘗試根據(jù) Python 版本、操作系統(tǒng)平臺、解釋器類型 來下載對應(yīng)的 wheel 文件 (.whl)。
如果找不到匹配的版本,就會報(bào)錯(cuò)說“不兼容”或者“找不到滿足要求的版本”。
所以我們需要兩件事:
先搞清楚自己當(dāng)前的 Python 環(huán)境是什么版本
查清楚某個(gè)包支持的版本范圍,然后挑一個(gè)能用的來裝
方法一:用 pip 官方命令查詢可用版本
最直接的方法就是用 pip install 包名== 然后按兩下 Tab,或者直接執(zhí)行:
pip install opencv-python==
它會直接報(bào)錯(cuò)并且告訴你所有可用的版本列表。你就可以自己挑一個(gè),比如:
pip install opencv-python==4.5.5.64
如果你不想一個(gè)個(gè)試,那可以再結(jié)合 pip index versions(pip 20.3+ 提供的功能):
pip index versions opencv-python
這個(gè)命令會把所有版本列出來,然后你對照一下自己 Python 的版本,就知道該裝哪個(gè)了。
方法二:conda 管理包環(huán)境
如果用 conda 的話,最好都用 conda 管理包環(huán)境。pip 的安裝一般都是包的最新版,往往會導(dǎo)致與環(huán)境下的其他包出現(xiàn)版本不兼容的情況,比如 numpy 和 pandas 等被其他包依賴,結(jié)果這倆單獨(dú)安裝的版本有點(diǎn)高等等。。。
你用 conda ,那就用 conda install 這個(gè)命令去安裝包。
去 conda 的官網(wǎng)搜索你要安裝的包,比如 opencv,然后里面會有 conda 安裝opencv的方式。cv2 是 opencv 安裝后,你使用的時(shí)候的名字,比如 import cv2; print(cv2.version),不是安裝包的名字。
所以建議你要安裝什么conda的包的時(shí)候,直接去官網(wǎng)搜索吧:

然后點(diǎn)擊進(jìn)去就能看到里面的安裝命令:

方法三:用 PyPI 官網(wǎng)查兼容性
第二種方式是去 PyPI 官網(wǎng)
在每個(gè)版本的頁面底部都會寫著它支持的 Python 版本,比如:
Requires: Python >=3.6, <3.10
這就很直觀。比如你是 Python 3.8,那這個(gè)庫就能裝。
如果它寫的是 >=3.9,那你在 Python 3.8 下就不行。
方法四:寫一個(gè)小腳本,自動檢查兼容性
有時(shí)候我們想在命令行里快速判斷某個(gè)包能不能在當(dāng)前 Python 版本下用,那就可以寫個(gè)小腳本,直接查詢 PyPI 的 JSON API。
PyPI 每個(gè)庫都有個(gè) JSON 接口,比如 https://pypi.org/pypi/opencv-python/json,里面有所有版本的 requires_python 信息。
我們可以用 requests 把它拉下來,然后比對當(dāng)前 Python 版本。
Demo代碼
import sys
import requests
from packaging.specifiers import SpecifierSet
from packaging.version import Version
def check_package_compatibility(package_name: str, python_version: str = None):
"""
檢查某個(gè)包在當(dāng)前Python版本下有哪些可安裝版本
"""
if python_version is None:
python_version = ".".join(map(str, sys.version_info[:3]))
url = f"https://pypi.org/pypi/{package_name}/json"
resp = requests.get(url)
if resp.status_code != 200:
print(f"? 包 {package_name} 不存在或網(wǎng)絡(luò)請求失敗")
return
data = resp.json()
releases = data.get("releases", {})
compatible_versions = []
for version, files in releases.items():
if not files: # 有的版本沒有whl文件
continue
# 檢查 requires_python 約束
for file in files:
requires = file.get("requires_python")
if requires:
spec = SpecifierSet(requires)
if Version(python_version) in spec:
compatible_versions.append(version)
break
else:
# 沒寫要求,默認(rèn)兼容
compatible_versions.append(version)
break
compatible_versions.sort(key=Version, reverse=True)
print(f"? 在Python {python_version} 下可用的 {package_name} 版本有:")
print(", ".join(compatible_versions[:10]), "...") # 只展示前10個(gè)
# 示例:檢查 opencv-python 在 Python 3.8 下能用哪些版本
if __name__ == "__main__":
check_package_compatibility("opencv-python", "3.8")
運(yùn)行效果
假設(shè)你運(yùn)行 python demo.py,輸出可能類似:
? 在Python 3.8 下可用的 opencv-python 版本有: 4.10.0.84, 4.9.0.80, 4.8.1.78, 4.7.0.72, 4.6.0.66 ...
這樣一來,你就不用一個(gè)個(gè)試,直接就知道哪些版本能用。
實(shí)際場景中的應(yīng)用
舉個(gè)真實(shí)的例子:
你在公司里有個(gè)項(xiàng)目環(huán)境是 Python 3.8,需要用到 opencv-python。但是直接 pip install cv2 報(bào)錯(cuò)。
你先用上面的小腳本跑一遍,發(fā)現(xiàn) 4.10.0.84 是兼容的。
然后你就可以直接:
pip install opencv-python==4.10.0.84
安裝完成之后,試一試:
import cv2 print(cv2.__version__)
輸出
4.10.0,說明安裝成功,兼容沒問題。
這種方法同樣適用于任何其他包,比如 pandas、scikit-learn、tensorflow,尤其是后者,兼容性問題更常見。
總結(jié)
遇到 Python 包和版本不兼容的時(shí)候,不要盲目亂試??梢园凑者@幾個(gè)思路來:
用 pip 的版本查詢命令 → 快速看到有哪些版本可裝
查 PyPI 官網(wǎng)的 requires_python → 確認(rèn)兼容范圍
寫個(gè)小腳本自動查詢 → 在實(shí)際開發(fā)中更高效
這樣你就能很快判斷到底該裝哪個(gè)版本,省下不少時(shí)間。
到此這篇關(guān)于Python版本與package版本兼容性檢查方法的文章就介紹到這了,更多相關(guān)Python與package版本兼容性檢查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python氣泡提示與標(biāo)簽的實(shí)現(xiàn)
這篇文章主要介紹了Python氣泡提示與標(biāo)簽的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python實(shí)現(xiàn)數(shù)據(jù)地址實(shí)體抽取
大家好,本篇文章主要講的是Python實(shí)現(xiàn)數(shù)據(jù)地址實(shí)體抽取,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02
Python使用Bokeh實(shí)現(xiàn)交互式圖表的創(chuàng)建
Bokeh?是一個(gè)流行的?Python?數(shù)據(jù)可視化庫,可以生成高質(zhì)量的交互式圖表,這篇文章主要就介紹了Python如何使用Bokeh實(shí)現(xiàn)交互式圖表的創(chuàng)建,需要的可以參考一下2023-06-06
python中sklearn的pipeline模塊實(shí)例詳解
這篇文章主要介紹了python中sklearn的pipeline模塊的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

