从Python代码中的pyproject.toml获取应用程序版本

问题描述 投票:0回答:4

我对 python 不太熟悉,我只用它做过自动化,所以我对包和所有东西都是新手。
我正在使用 Flask、Gunicorn 和 Poetry 创建一个 API。
我注意到 pyproject.toml 中有一个版本号,我想创建一个路由 /version 来返回我的应用程序的版本。
我的应用程序结构看起来像这样的自动取款机:

├── README.md
├── __init__.py
├── poetry.lock
├── pyproject.toml
├── tests
│   └── __init__.py
└── wsgi.py

其中

wsgi.py
是我运行应用程序的主文件。

我看到人们使用 importlib 但我没有找到如何让它工作,因为它与以下内容一起使用:

 __version__ = importlib.metadata.version("__package__")

但我不知道这个package是什么意思。

python python-packaging python-poetry python-importlib
4个回答
7
投票

您不应该使用

__package__
,它是“导入包”的名称(或者可能是导入模块,具体取决于这行代码所在的位置),而这不是
importlib.metadata.version()
所期望的。此函数需要分发包的名称(您通过 pip 安装的东西),即您在
pyproject.toml
中编写的
name = "???"


0
投票

我也有同样的疑问。

我能想到的解决方案之一是将 pyproject.toml 文件作为数据文件与项目一起发送。这可以通过将 pyproject.toml 放在

your_package/data
内,并将
include = [{path = "phuego/data/pyproject.toml"}]
放在 pyproject.toml 中的
[tool.poetry]
下来完成。然后,您可以使用
toml
包来访问它。

但我不相信这个解决方案。也许有更好的主意。


0
投票

我正在做这个:

from poetry.core.factory import Factory

def display_version():

    __thisScript__ = os.path.realpath(__file__)
    __thisFolder__ = os.path.dirname(__thisScript__)
    factory = Factory()
    this_project = factory.create_poetry(__thisFolder__)
    print(f"{this_project.package.name} version {this_project.package.version}")
    print(f"{this_project.package.description}")

    sys.exit(0)
# end def

-1
投票

您可以使用

toml
包从 pyproject.toml 中提取版本来读取 toml 文件,然后将其显示在网页中。

© www.soinside.com 2019 - 2024. All rights reserved.