Python 写一个cli

邱秋 • 2023年11月20日 • 阅读:119 • python

我准备撸一个 cli 工具,名曰 : cloudoll

要实现自定义的命令行工具,可以使用 Python 的包管理工具 setuptools 来创建一个可执行的脚本。下面是一些步骤,以实现你希望的命令 cloudoll -p test

  1. 创建项目结构

首先,确保你的项目结构如下:

my_project/
├── cloudoll/
│   └── __init__.py
├── setup.py
└── README.md

cloudoll/ 目录中应该包含你的 Python 包代码,setup.py 是用于构建和安装包的 setuptools 配置文件。

  1. 安装 setuptoolsclick

你需要安装 setuptools 以构建包,并且可以使用 click 来处理命令行参数。你可以使用以下命令安装它们:

pip install setuptools click
  1. 创建命令行脚本

cloudoll/ 目录中,创建一个 Python 脚本,例如 cli.py,用于处理命令行参数和执行相应的操作。

import click

@click.command()
@click.option('-q', '--param2', help='Parameter 2')
@click.option('-r', '--param3', help='Parameter 3') 
@click.option('-p', '--param', help='Specify a parameter')
def main(param):
    """Your CLI tool description."""
    if param:
        click.echo(f'Parameter received: {param}')
    else:
        click.echo('No parameter specified.')

if __name__ == '__main__':
    main()
  1. 配置 setup.py

编辑 setup.py 文件以定义你的包和命令行工具。示例配置如下:

from setuptools import setup, find_packages

setup(
    name='cloudoll',
    version='0.1',
    packages=find_packages(),
    install_requires=[
        'click',
    ],
    entry_points={
        'console_scripts': [
            'cloudoll = cloudoll.cli:main',
        ],
    },
)

这个配置文件中,我们定义了包名、版本、依赖项(click),以及通过 entry_points 设置了命令行工具的入口点。'cloudoll = cloudoll.cli:main' 表示当用户运行 cloudoll 命令时,将执行 cloudoll.cli 模块中的 main 函数。

  1. 构建和安装包

在项目的根目录下运行以下命令来构建和安装你的包:

python setup.py install
  1. 使用命令行工具

现在,你可以在命令行中使用 cloudoll -p test 来运行你的命令行工具。根据你的需求,可以在 cli.py 中添加逻辑来执行对应的操作。

这些步骤可以帮助你创建一个自定义的命令行工具,并通过 pip install cloudoll 来安装它。

如果你的包还没有发布到 PyPI 或其他包管理仓库,但想在本地测试它,可以使用 pip 的本地安装功能。以下是一些步骤来在本地测试你的 Python 包:

  1. 构建包

在你的包目录中,确保有一个 setup.py 文件(通常已经创建了,如果没有,参考上面的步骤创建),然后运行以下命令来构建你的包:

python setup.py sdist

这将创建一个源分发包(.tar.gz 文件)。

  1. 安装包

在包的根目录中,使用 pip 来安装你的包。可以使用 -e 选项来进行可编辑安装,这样你可以在包代码发生更改时立即看到效果:

pip install -e .

注意,命令中的 . 表示当前目录,所以确保你在包的根目录运行这个命令。

  1. 测试你的包

现在,你可以在任何地方使用你的包。你可以在 Python 中导入它并测试它的功能。如果你的包是一个命令行工具,你也可以在命令行中运行它。

mycli -p test  # 用你的包名和参数测试命令行工具
  1. 卸载包(可选):

如果你需要卸载包,可以使用以下命令:

pip uninstall your-package-name

替换 your-package-name 为你的包名。

通过这些步骤,你可以在本地测试你的 Python 包,而无需将其发布到 PyPI 或其他包管理仓库。这对于包的开发和调试非常有用。

当然随着需求的扩展, 可能需要更多的命令, 比如命令组 如: cloudoll start -p 8080

我们稍做修改即可:

# cli.py

import click

@click.group()
def cli():
    pass

@cli.command()
@click.option('-p', '--param', help='Specify a parameter for start command')
def start(param):
    click.echo(f'Starting with parameter: {param}')

@cli.command()
@click.option('-a', '--attribute', help='Specify an attribute for create command')
def create(attribute):
    click.echo(f'Creating with attribute: {attribute}')

if __name__ == '__main__':
    cli()
  1. cloudoll 文件中引用入口点:
# cloudoll

from cli import cli

if __name__ == '__main__':
    cli()
  1. 在包的根目录中添加 setup.py 文件:
# setup.py

from setuptools import setup, find_packages

setup(
    name='cloudoll',
    version='0.1',
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'cloudoll = cli:cli',
        ],
    },
)

在这个例子中,我们使用 Click 库定义了一个命令组 (cli) 和两个子命令 (startcreate)。每个子命令都定义了自己的选项,例如 -p-a。使用 click.echo 输出结果。

安装包并运行 cloudoll start -p 123cloudoll create -a 456 进行测试。Click 将自动处理命令行参数的解析和调用相应的函数。

我,秦始皇,打钱!