我对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相同的文件夹构建的诗歌。