我对 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__
,它是“导入包”的名称(或者可能是导入模块,具体取决于这行代码所在的位置),而这不是 importlib.metadata.version()
所期望的。此函数需要分发包的名称(您通过 pip 安装的东西),即您在 pyproject.toml
中编写的 name = "???"
。
我也有同样的疑问。
我能想到的解决方案之一是将 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