[英]Ensuring minimum version for imported Python package
大多数 Python 包都遵循在[package_name].version.version
中将版本作为字符串提供的约定。 我们以 Numpy 为例。 假设我想导入 Numpy 但确保最低版本为1.18.1
。 这就是我目前所做的:
import numpy as np
if tuple(map(int, np.version.version.split('.'))) < (1, 18, 1):
raise ImportError('Numpy version too low! Must be >= 1.18.1')
虽然这似乎有效,但它需要我在检查版本之前导入包。 如果条件不满足,不必导入包就好了。
它似乎也有点“hacky”,感觉可能有一种使用 Python 标准库的方法可以做到这一点。 类似于version('numpy') > '1.18.1'
。 但我一直没能找到。
有没有办法在 Python 标准库的范围内在导入包之前检查包的版本?
我正在寻找 Python 代码中的编程解决方案。 告诉我使用requirements.txt
或pip install
并没有回答这个问题。
编辑以添加上下文:将此包添加到我的requirements.txt
没有用,因为导入的包应该是可选的依赖项。 此代码将进入一个子模块,该子模块可以通过try
语句选择性地加载到__init__.py
。 本质上,包的某些功能只有在找到并成功导入最低版本的包时才可用。
使用子pip show
为特定包运行pip show
然后解析结果以将安装的版本与您的要求进行比较。
>>> import subprocess
>>> result = subprocess.run(['pip', 'show', 'numpy'], stdout=subprocess.PIPE)
>>> result.stdout
b'Name: numpy\r\nVersion: 1.17.4\r\nSummary: NumPy is the fundamental package for array computing with Python.\r\nHome-page: https://www.numpy.org\r\nAuthor: Travis E. Oliphant et al.\r\nAuthor-email: None\r\nLicense: BSD\r\nLocation: c:\\python38\\lib\\site-packages\r\nRequires: \r\nRequired-by: scipy, scikit-learn, perfplot, pandas, opencv-python, matplotlib\r\n'
>>> result = subprocess.run(['pip', 'show', 'pandas'], stdout=subprocess.PIPE)
>>> for thing in result.stdout.splitlines():
... print(thing)
b'Name: pandas'
b'Version: 0.25.3'
b'Summary: Powerful data structures for data analysis, time series, and statistics'
b'Home-page: http://pandas.pydata.org'
b'Author: None'
b'Author-email: None'
b'License: BSD'
b'Location: c:\\python38\\lib\\site-packages'
b'Requires: numpy, python-dateutil, pytz'
b'Required-by: '
>>>
>>> from email.header import Header
>>> result = subprocess.run(['pip', 'show', 'pandas'], stdout=subprocess.PIPE)
>>> h = Header(result.stdout)
>>> print(str(h))
Name: pandas
Version: 0.25.3
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: http://pandas.pydata.org
Author: None
Author-email: None
License: BSD
Location: c:\python38\lib\site-packages
Requires: python-dateutil, pytz, numpy
Required-by:
>>> d = {}
>>> for line in result.stdout.decode().splitlines():
... k,v = line.split(':',1)
... d[k] = v
>>> d['Version']
' 0.25.3'
>>>
或者看看一切:
>>> result = subprocess.run(['pip', 'list'], stdout=subprocess.PIPE)
>>> for thing in result.stdout.splitlines():
print(thing)
b'Package Version '
b'---------------- ----------'
b'-illow 6.2.1 '
b'aiohttp 3.6.2 '
b'appdirs 1.4.3 '
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.