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



我对python不是很熟悉,我只做过自动化,所以我对包和所有东西都是新手
我正在用Flask、Gunicorn和Poetry创建一个API
我注意到pyproject.toml中有一个版本号,我想创建一个返回我的应用程序版本的路由/版本
我的应用程序结构如下atm:

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

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

我看到有人在使用importlib,但我不知道如何使其工作,因为它与
__version__ = importlib.metadata.version("__package__")
一起使用,但我完全不知道这个是什么意思。

您不应该使用__package__,它是"进口包";(或者导入模块,具体取决于这行代码的位置),而这不是importlib.metadata.version()所期望的。此函数需要分发包的名称(您pip-install的东西),也就是您在pyproject.toml中编写的name = "???"

因此,如果您想要获得其版本字符串的应用程序或库名为Foo,那么您只需要调用以下

import importlib.metadata
version_string_of_foo = importlib.metadata.version('Foo')

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

我也有同样的问题。

我能想到的解决方案之一是将pyproject.toml文件作为数据文件与项目一起发送。这可以通过将pyproject.toml放在your_package/data中,并将include = [{path = "phuego/data/pyproject.toml"}]放在pyproject.toml中的[tool.poetry]下来完成。然后,您可以使用toml包来访问它。

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

我正在做这件事:

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

我还将pyproject.toml文件中包含的语句添加到了我的pyproject.tom文件中,正如陈浩琪所提到的那样

[tool.poetry]
name = "myApp"
version = "0.1.5"
description = "A faster alternative to Windows `rmdir /s /q` for large directories."
authors = ["Joe B"]
readme = "README.md"
include = [{path = "./pyproject.toml"}]

我使用了一个到pyproject.toml的相对路径,因为我总是使用从与pyproject.tom相同的文件夹构建的诗歌。

最新更新