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

pgo*_*ssa 4 python python-importlib python-packaging python-poetry

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

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

wsgi.py运行应用程序的主文件在哪里。

\n

我看到人们使用 importlib 但我没有找到如何让它工作,因为它与以下命令一起使用:
\n __version__ = importlib.metadata.version("__package__")
\n但我不知道这个的含义。

\n

sin*_*roc 12

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

因此,如果您要获取其版本字符串的应用程序或库是已命名的Foo,那么您只需调用以下命令

import importlib.metadata

version_string_of_foo = importlib.metadata.version('Foo')
Run Code Online (Sandbox Code Playgroud)