繁体   English   中英

确保导入的 Python 包的最低版本

[英]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.txtpip 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     '
...

使用容器来控制程序的所有依赖项和运行时环境。 一种简单的方法是创建一个 Docker 映像,其中包含您需要的确切 Python 版本。 然后使用requirements.txt安装您需要的正确版本的正确 python 模块。

最后,您可以创建一个 shell 脚本或类似的东西,一键启动 docker 容器。

或者(如果 Docker 看起来有点矫枉过正),请查看venv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM