gpt4 book ai didi

python - 从包中获取 Python 包分发版本

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:24 25 4
gpt4 key购买 nike

您可以使用以下命令获取 python 发行版的版本

import pkg_resources
pkg_resources.get_distribution("distro").version

如果您知道发行版名称,那就太好了,但是我需要在运行时动态地找出我的发行版名称。

# Common framework base app class, extended by each app
class App(object):
def get_app_version(self) -> str:
package_name = self.__class__.__module__.split('.')[0]
try:
return pkg_resources.get_distribution(package_name).version
except Exception:
return "development"

这适用于应用程序包名称与分发名称相同的情况(例如 requests)。然而,一旦它们不匹配(例如 my-app 包含包 my_app),这就会失败。

所以我需要的是发行版和它们的包之间的映射,我确定它一定存在于某个地方,因为当您调用卸载时 pip 似乎知道要删除什么:

$ pip uninstall requests
Uninstalling requests-2.21.0:
Would remove:
/home/user/.virtualenvs/app/lib/python3.6/site-packages/requests-2.21.0.dist-info/*
/home/user/.virtualenvs/app/lib/python3.6/site-packages/requests/*

如何以编程方式访问此映射?

最佳答案

我认为项目名称应该尽可能硬编码。如果不是,那么像下面这样的函数可以帮助找出包含当前文件 (__file__) 的已安装发行版的元数据:

import pathlib
import importlib_metadata

def get_project_distribution():
for dist in importlib_metadata.distributions():
try:
relative = pathlib.Path(__file__).relative_to(dist.locate_file(''))
except ValueError:
pass
else:
if relative in dist.files:
return dist
return None

project_distribution = get_project_distribution()
if project_distribution:
project_name = project_distribution.metadata['Name']
version = project_distribution.metadata['Version']

更新(2021 年 2 月):

由于 importlib_metadata 中新添加的 packages_distributions() 函数,看起来这会变得更容易:

关于python - 从包中获取 Python 包分发版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56031858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com