Python 写一个cli
我准备撸一个 cli 工具,名曰 : cloudoll
要实现自定义的命令行工具,可以使用 Python 的包管理工具 setuptools
来创建一个可执行的脚本。下面是一些步骤,以实现你希望的命令 cloudoll -p test
:
- 创建项目结构:
首先,确保你的项目结构如下:
my_project/
├── cloudoll/
│ └── __init__.py
├── setup.py
└── README.md
cloudoll/
目录中应该包含你的 Python 包代码,setup.py
是用于构建和安装包的 setuptools
配置文件。
- 安装
setuptools
和click
:
你需要安装 setuptools
以构建包,并且可以使用 click
来处理命令行参数。你可以使用以下命令安装它们:
pip install setuptools click
- 创建命令行脚本:
在 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()
- 配置
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
函数。
- 构建和安装包:
在项目的根目录下运行以下命令来构建和安装你的包:
python setup.py install
- 使用命令行工具:
现在,你可以在命令行中使用 cloudoll -p test
来运行你的命令行工具。根据你的需求,可以在 cli.py
中添加逻辑来执行对应的操作。
这些步骤可以帮助你创建一个自定义的命令行工具,并通过 pip install cloudoll
来安装它。
如果你的包还没有发布到 PyPI 或其他包管理仓库,但想在本地测试它,可以使用 pip
的本地安装功能。以下是一些步骤来在本地测试你的 Python 包:
- 构建包:
在你的包目录中,确保有一个 setup.py
文件(通常已经创建了,如果没有,参考上面的步骤创建),然后运行以下命令来构建你的包:
python setup.py sdist
这将创建一个源分发包(.tar.gz
文件)。
- 安装包:
在包的根目录中,使用 pip
来安装你的包。可以使用 -e
选项来进行可编辑安装,这样你可以在包代码发生更改时立即看到效果:
pip install -e .
注意,命令中的 .
表示当前目录,所以确保你在包的根目录运行这个命令。
- 测试你的包:
现在,你可以在任何地方使用你的包。你可以在 Python 中导入它并测试它的功能。如果你的包是一个命令行工具,你也可以在命令行中运行它。
mycli -p test # 用你的包名和参数测试命令行工具
- 卸载包(可选):
如果你需要卸载包,可以使用以下命令:
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()
- 在
cloudoll
文件中引用入口点:
# cloudoll
from cli import cli
if __name__ == '__main__':
cli()
- 在包的根目录中添加
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
) 和两个子命令 (start
和 create
)。每个子命令都定义了自己的选项,例如 -p
和 -a
。使用 click.echo
输出结果。
安装包并运行 cloudoll start -p 123
或 cloudoll create -a 456
进行测试。Click 将自动处理命令行参数的解析和调用相应的函数。