问题描述
在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() #
并对所有其他软件包重复此操作。如果不满足条件,有没有办法遍历所有指定的程序包并引发错误?
解决方法
您可以使用以下代码来检查软件包是否存在(确保首先创建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 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")
,
您可以使用setuptools的pkg_resources
接收已安装软件包的列表:
import pkg_resources
package_versions = {
p.project_name: p.version for p in pkg_resources.working_set
}
现在,您可以遍历文件并将其版本与package_versions
字典中的版本进行比较。