2 回答

TA貢獻1921條經驗 獲得超9個贊
您可以使用packaging模塊。安裝它pip install packaging然后:
from packaging import version
import pypfopt
ver = pypfopt.__version__
if version.parse(ver) < version.parse('1.2.6'):
logger.error('Version is too low. Update')

TA貢獻1872條經驗 獲得超4個贊
pkg_resources,與 一起分發setuptools,做您需要的事情并處理package.__version__不存在的情況。
pypfopt==1.2.6以下是您在示例中需要最小版本的方式:
python -c 'import pkg_resources; pkg_resources.require("pypfopt>=1.2.6")'
我沒有安裝這個軟件包,所以我得到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require
needed = self.resolve(parse_requirements(requirements))
File "python3.8/site-packages/pkg_resources/__init__.py", line 770, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'pypfopt>=1.2.6' distribution was not found
and is required by the application
警告:我經常使用它,直到現在我遇到了一個問題,即相關包具有正確的版本,但其依賴項不滿足,因此pkg_resources報告失敗。
例如:我已經pytorch_lightning==1.0.5安裝了,但我為其依賴項之一安裝了新版本,但它未列為受支持。我期望以下內容能夠通過,但失敗了:
python -c 'import pkg_resources; pkg_resources.require("pytorch_lightning>=1.0.4")'
和:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require
needed = self.resolve(parse_requirements(requirements))
File "python3.8/site-packages/pkg_resources/__init__.py", line 775, in resolve
raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict:
(torch 1.8.0.dev20201106+cu110 (python3.8/site-packages),
Requirement.parse('torch<1.8,>=1.3'), {'pytorch-lightning'})
如果您想確保不僅所需的模塊存在并且具有正確的版本,而且其依賴項也正確,那么這是正確的做法。
所以我在這里發出信號,這pkg_resources不僅僅是比較已安裝軟件包的版本號 - 它還檢查其依賴項。這可能會也可能不會滿足您的需求。
這是不檢查依賴關系是否正常的版本。在其中,我們用來pkg_resources獲取包的版本,并將比較委托給packagingSO 的各種答案中所描述的:
import pkg_resources
from packaging import version
pkg = "pytorch_lightning"
min_ver = "1.0.4"
got_ver = pkg_resources.get_distribution("pytorch_lightning").version
if version.parse(got_ver) < version.parse(min_ver):
raise pkg_resources.VersionConflict(f"{pkg}>={min_ver} is needed, but found {pkg}=={got_ver}")
這次,盡管依賴項不正確(在我的示例中),但版本號足夠高就足夠了,因此腳本可以繼續使用pytorch_lightning(我驗證了它與較新版本的依賴項一起工作得很好)。
添加回答
舉報