如何通过PyPI打包Python工具实现无需python3和.py的命令行调用
实现Python命令行工具并通过PyPI发布的步骤
要实现pip install后直接用命令名调用的效果,核心是通过Python打包工具配置控制台入口点,无需手动处理chmod权限,以下是具体步骤:
1. 整理项目结构
先把项目调整为标准Python包结构:
mycli/ __init__.py cli.py pyproject.toml README.md
mycli是你的包名(对应最终的packageName)cli.py存放命令行逻辑代码
2. 编写命令行核心逻辑
在cli.py里实现你的命令行功能,比如用Python标准库argparse处理参数:
import argparse def main(): parser = argparse.ArgumentParser(description="我的命令行工具") parser.add_argument("--name", help="输入名称") args = parser.parse_args() if args.name: print(f"你好, {args.name}!") else: print("欢迎使用我的命令行工具!") if __name__ == "__main__": main()
如果追求更简洁的语法,也可以用click库,安装click后代码会更优雅,但argparse无需额外依赖。
3. 配置打包文件(关键)
创建pyproject.toml(PEP 621推荐的现代打包配置文件),内容如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "mycli" version = "0.1.0" authors = [ { name="你的名字", email="你的邮箱" } ] description = "我的第一个Python命令行工具" readme = "README.md" requires-python = ">=3.7" [project.scripts] mycli = "mycli.cli:main"
重点是[project.scripts]部分:mycli是你要在终端调用的命令名,mycli.cli:main表示指向mycli包下cli.py文件里的main函数。
如果习惯用旧版的setup.py,也可以这样写:
from setuptools import setup setup( name="mycli", version="0.1.0", packages=["mycli"], entry_points={ "console_scripts": [ "mycli = mycli.cli:main", ] }, )
4. 打包并上传到PyPI
安装打包工具
pip install build twine
生成包文件
python -m build
执行后会在dist目录下生成.tar.gz和.whl两种格式的包。
上传到PyPI
twine upload dist/*
按照提示输入你的PyPI账号密码即可完成发布。
5. 验证效果
上传成功后,在任意终端执行:
pip install mycli
安装完成后直接输入命令:
mycli --name 张三
就能看到输出你好, 张三!,完全不需要输入python3、带.py后缀,也不用进入项目目录。
为什么不用手动chmod?
通过entry_points(或project.scripts)配置后,pip在安装时会自动为生成的可执行脚本添加执行权限,不管是Linux/macOS还是Windows系统,都不需要手动修改权限。
内容的提问来源于stack exchange,提问作者PatzEdi
相关产品推荐
相关产品推荐

