【问题标题】:How to check if all packages meet version requirements?如何检查所有包是否满足版本要求?
【发布时间】:2020-11-11 09:09:30
【问题描述】:

在 Python 解释器中运行脚本时,我想检查是否使用以下版本:

absl-py==0.1.10
agate==1.6.0
agate-dbf==0.2.0
agate-excel==0.2.1
agate-sql==0.5.2
appnope==0.1.0

例如,我可以这样做:

if absl-py.__version__ != "0.1.10":
    logging.error("update to version == 0.1.10")
    sys.exit() #

对所有其他包重复此操作。有没有办法遍历所有指定的包并在不满足条件时引发错误?

【问题讨论】:

    标签: python requirements


    【解决方案1】:

    您可以这样做并在字典中定义模块和版本:

    import pkg_resources
    
    module_versions = {"absl-py":"0.1.10", "agate":"1.6.0"}
    
    for module, v_req in module_versions.items():
        try:
            if pkg_resources.get_distribution(module).version != v_req:
                print(f"{module}, Required Version: {v_req}, Your Version: {v_inst}")
        except:
            print(f"{module} not installed")
    

    【讨论】:

    • 即使安装了absl-py 也会失败。
    【解决方案2】:

    您可以使用以下代码检查包是否存在(确保先创建requirements.txt):

    with open("requirements.txt") as f:
        packages = f.read().split("\n")
        for package in packages:
            package_name, package_version = package.split("==")
            package_name = "_".join(package_name.split("-"))
            exec(f"""\
    try:
        import {package_name}
    except ImportError:
        print("{package_name} doesn't exist") 
    else:
        if not {package_name}.__version__== '{package_version}': 
            print(f"{package_name} is not up to date")""")
            
    
    

    【讨论】:

    • 有了__import__(),您将不必诉诸不可原谅的exec 诅咒。此外,包发布名称并不总是与其导入名称相对应,例如PyYAMLyaml.
    【解决方案3】:

    您可以使用 setuptools 的pkg_resources 接收已安装软件包的列表:

    import pkg_resources
    package_versions = {
        p.project_name: p.version for p in pkg_resources.working_set
    }
    

    现在您可以遍历文件并将其中的版本与package_versions 字典中的版本进行比较。

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2016-04-26
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多