And*_*rra 9 python command-line-interface python-click python-poetry
我正在使用具有以下结构的 Poetry 开发 Python 包:
/packagename
/packagename
/tests
__init__.py
test_packagename.py
__init__.py
packagename.py
pyproject.toml
Run Code Online (Sandbox Code Playgroud)
所有的包代码都在 packagename.py 中,它以__init__.py.
我想添加一个 CLI,我的目标是在命令行中执行以下操作:
<packagename> <packagefunction>
Run Code Online (Sandbox Code Playgroud)
为此,我使用了 Python 的 click 包并将我的<packagefunction>内部写packagename.py为:
@click.command()
def packagefunction():
Run Code Online (Sandbox Code Playgroud)
目前,我已将入口点添加到诗歌配置文件中:
[tool.poetry.scripts]
<packagefunction> = '<packagename>:<packagefunction>'
Run Code Online (Sandbox Code Playgroud)
并运行:
poetry run <packagefunction>
Run Code Online (Sandbox Code Playgroud)
完美执行。
但是,我知道这不是正确的方法,我希望 CLI 使用上面显示的命令执行。
Ste*_*uch 11
要实现您所追求的命令行,您可以使用:
click.Group()import click
@click.group()
def main():
"""packagename cli"""
Run Code Online (Sandbox Code Playgroud)
然后要使用该组,您可以使用@main.command()装饰器,例如:
@main.command()
def packagefunction():
"""packagefunction subcommand"""
Run Code Online (Sandbox Code Playgroud)
而不是@click.command()装饰器。
要使用诗歌安装packagename命令并调用模块中的main组 packagename:
[tool.poetry.scripts]
# command_name = module_for_handler : function_for_handler
<packagename> = '<packagename>:<main>'
Run Code Online (Sandbox Code Playgroud)
代替:
[tool.poetry.scripts]
<packagefunction> = '<packagename>:<packagefunction>'
Run Code Online (Sandbox Code Playgroud)