Poetry 管理 python 包 CLI

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命令并调用模块中的mainpackagename

[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)