如何以编程方式检查python软件包是否为最新版本?




pip gekko (4)

快速版本(仅检查软件包)

这是一种用不可用的版本(例如 pip install package_name==random 调用该程序包的技巧,响应将提供所有可用的版本,然后程序读取最新的版本。

然后,它运行 pip show package_name 并获取软件包的当前版本。

如果找到匹配项,则返回True,否则返回False

考虑到它是 pip ,这是一个可靠的选择

import subprocess
import sys
def check(name):
    latest_version = str(subprocess.run([sys.executable, '-m', 'pip', 'install', '{}==0'.format(name)], capture_output=True, text=True))
    latest_version = latest_version[latest_version.find('(from versions:')+15:]
    latest_version = latest_version[:latest_version.find(')')]
    latest_version = latest_version.replace(' ','').split(',')[-1]

    current_version = str(subprocess.run([sys.executable, '-m', 'pip', 'show', '{}'.format(name)], capture_output=True, text=True))
    current_version = current_version[current_version.find('Version:')+8:]
    current_version = current_version[:current_version.find('\\n')].replace(' ','') 

    if latest_version == current_version:
        return True
    else:
        return False

这个要求 pip list --outdated

import subprocess
import sys

def check(name):
    reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'list','--outdated'])
    outdated_packages = [r.decode().split('==')[0] for r in reqs.split()]
    return name in outdated_packages

如何在脚本中以编程方式检查软件包的最新版本,并返回true或false?

我可以使用以下脚本进行检查:

package='gekko'
import pip
if hasattr(pip, 'main'):
    from pip import main as pipmain
else:
    from pip._internal import main as pipmain
pipmain(['search','gekko'])

或使用命令行:

(base) C:\User>pip search gekko
gekko (0.2.3)  - Machine learning and optimization for dynamic systems
  INSTALLED: 0.2.3 (latest)

但是,如何以编程方式检查并返回true或false?


最新版本:

我的项目 luddite 具有此功能:

>>> import luddite
>>> luddite.get_version_pypi("gekko")
'0.2.3'

安装版本:

检查已安装版本的规范方法只是访问顶级名称空间的 __version__ 属性:

>>> import gekko
>>> gekko.__version__
'0.2.0'

不幸的是,并非所有项目都设置此属性。 如果没有,则可以使用 pkg_resources 从元数据中挖掘出来:

>>> import pkg_resources
>>> pkg_resources.get_distribution("gekko").version
'0.2.0'

这样做至少可以达到演示目的。 只需使用您要检查的软件包名称调用 isLatestVersion 即可。 如果您在重要的地方使用此功能,则可能会尝试/捕获url请求,因为可能无法访问Internet。 另请注意,如果未安装该软件包,则 isLatestVersion 将返回False。

已针对Python 3.7.4和Pip 19.0.3进行了测试。

import pip
import subprocess
import json
import urllib.request
from pip._internal.operations.freeze import freeze

def isLatestVersion(pkgName):
    # Get the currently installed version
    current_version = ''
    for requirement in freeze(local_only=False):
        pkg = requirement.split('==')
        if pkg[0] == pkgName:
            current_version = pkg[1]

    # Check pypi for the latest version number
    contents = urllib.request.urlopen('https://pypi.org/pypi/'+pkgName+'/json').read()
    data = json.loads(contents)
    latest_version = data['info']['version']

    return latest_version == current_version

通过 查询PyPI API 自己编写一个简单的脚本并不难。 使用最新的Python 3.8,可以仅使用标准库(使用Python 3.7或更旧版本时,必须安装 importlib_metadata ):

# check_version.py

import json
import urllib.request
import sys

try:
    from importlib.metadata import version
except ImportError:
    from importlib_metadata import version

from distutils.version import LooseVersion


if __name__ == '__main__':
    name = sys.argv[1]
    installed_version = LooseVersion(version(name))

    # fetch package metadata from PyPI
    pypi_url = f'https://pypi.org/pypi/{name}/json'
    response = urllib.request.urlopen(pypi_url).read().decode()
    latest_version = max(LooseVersion(s) for s in json.loads(response)['releases'].keys())

    print('package:', name, 'installed:', installed_version, 'latest:', latest_version)

用法示例:

$ python check_version.py setuptools
package: setuptools installed: 41.2.0 latest: 41.6.0

如果您恰好安装了 packaging ,那么它是 distutils.version 进行版本分析的更好选择:

from distutils.version import LooseVersion

...

LooseVersion(s)

变成

from packaging.version import parse

...

parse(s)




gekko