Python 命令行工具编译argparse
1-妇女之友-argparse
1-脚本代码
#!/usr/bin/env python3""" argparse 示例脚本 演示如何使用 Python 标准库 argparse 创建命令行工具 """importargparseimportsysdefcreate_parser():"""创建命令行参数解析器"""parser=argparse.ArgumentParser(description="这是一个简单的命令行工具示例",epilog="示例: python argparse_01_simple.py 张三 --age 25 --city 北京",formatter_class=argparse.RawDescriptionHelpFormatter)# 位置参数parser.add_argument("name",type=str,help="你的名字")# 可选参数parser.add_argument("-a","--age",type=int,help="你的年龄")parser.add_argument("-c","--city",type=str,default="未知",help="你所在的城市 (默认: 未知)")parser.add_argument("--verbose",action="store_true",help="显示详细信息")parser.add_argument("--version",action="version",version="%(prog)s 1.0.0")returnparserdefmain():"""主函数"""print("正在执行 argparse 示例程序...")parser=create_parser()args=parser.parse_args()# 基本问候print(f"你好,{args.name}!")# 如果有年龄参数ifargs.age:print(f"你今年{args.age}岁了。")# 年龄分类ifargs.age<18:print("你还是个未成年人士!")elifargs.age<30:print("你正处于青壮年时期!")elifargs.age<50:print("你正值壮年!")else:print("你已经步入中老年阶段!")# 显示城市信息print(f"你来自{args.city}")# 详细信息模式ifargs.verbose:print("\n--- 详细信息 ---")print(f"程序名称:{sys.argv[0]}")print(f"解析到的参数:{args}")print("感谢使用这个示例程序!")if__name__=="__main__":main()2-setup脚本
#!/usr/bin/env python3""" setup.py - Python 包配置文件 用于将命令行工具打包成可安装的包 """fromsetuptoolsimportsetup,find_packages# 读取 README 文件(如果存在)try:withopen("README.md","r",encoding="utf-8")asfh:long_description=fh.read()exceptFileNotFoundError:long_description="Python 命令行工具示例项目"# 读取 requirements.txt 文件(如果存在)requirements=[]try:withopen("requirements.txt","r",encoding="utf-8")asfh:requirements=[line.strip()forlineinfhifline.strip()andnotline.startswith("#")]exceptFileNotFoundError:# 如果没有 requirements.txt,指定基本依赖requirements=["click>=8.0.0","fire>=0.4.0"]setup(# 基本信息name="python-cli-examples",version="1.0.0",author="开发者",author_email="developer@example.com",description="Python 命令行工具开发示例集合",long_description=long_description,long_description_content_type="text/markdown",url="https://github.com/example/python-cli-examples",# 包配置(由于没有包结构,使用scripts配置)# packages=find_packages(),py_modules=["argparse_01_simple"],classifiers=["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","Topic :: Software Development :: Libraries :: Python Modules","Topic :: System :: Systems Administration","Topic :: Utilities","License :: OSI Approved :: MIT License","Programming Language :: Python :: 3","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Operating System :: OS Independent",],# Python 版本要求python_requires=">=3.7",# 依赖包install_requires=requirements,# 额外依赖组extras_require={"dev":["pytest>=6.0","pytest-cov>=2.0","black>=21.0","flake8>=3.8","mypy>=0.900",],"test":["pytest>=6.0","pytest-cov>=2.0",],"docs":["sphinx>=4.0","sphinx-rtd-theme>=0.5",],},# 命令行入口点entry_points={"console_scripts":[# argparse 示例命令"argparse-demo=argparse_01_simple:main",],},# 包含的数据文件include_package_data=True,package_data={"":["*.md","*.txt","*.yml","*.yaml"],},# 项目 URLproject_urls={"Bug Reports":"https://github.com/example/python-cli-examples/issues","Source":"https://github.com/example/python-cli-examples","Documentation":"https://python-cli-examples.readthedocs.io/",},# 关键词keywords="cli argparse click fire command-line tools examples",# 许可证license="MIT",# 是否包含源码zip_safe=False,)3-项目测试
# 1-目录文件展示(base)MacBook-Pro:python_setup_demo rong$lsBUILD_GUIDE.md argparse_01_simple.py setup.py# 2-原生脚本测试(base)MacBook-Pro:python_setup_demo rong$ python argparse_01_simple.py 张三 -a25-c 北京 正在执行 argparse 示例程序... 你好,张三! 你今年25岁了。 你正处于青壮年时期! 你来自北京# 3-安装执行脚本(base)MacBook-Pro:python_setup_demo rong$ pipinstall.Lookinginindexes: https://pypi.tuna.tsinghua.edu.cn/simple Processing /Users/rong/Documents/EnzoApplication/WorkSpace/Python/20251222_Python_Setup/python_setup_demo Preparing metadata(setup.py)...doneRequirement already satisfied: click>=8.0.0in/Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages(from python-cli-examples==1.0.0)(8.0.4)Requirement already satisfied: fire>=0.4.0in/Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages(from python-cli-examples==1.0.0)(0.7.1)Requirement already satisfied: termcolorin/Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages(from fire>=0.4.0->python-cli-examples==1.0.0)(3.2.0)Building wheelsforcollected packages: python-cli-examples Building wheelforpython-cli-examples(setup.py)...doneCreated wheelforpython-cli-examples:filename=python_cli_examples-1.0.0-py3-none-any.whlsize=3088sha256=1e38d417b4c61a60b3acf3ecc8babb938f239f182dbd9b86b67640089ab52861 Storedindirectory: /private/var/folders/kt/jy68vj1523dclg3py07q6zxc0000gn/T/pip-ephem-wheel-cache-5u7bw0u5/wheels/3d/19/5b/66b6bb4de747fb17d2199f8aa5945077a5084fa9a196f1092c Successfully built python-cli-examples Installing collected packages: python-cli-examples Successfully installed python-cli-examples-1.0.0# 4-安装后直接测试1(base)MacBook-Pro:python_setup_demo rong$ argparse-demo 测试用户 --age30--city 上海 --verbose 正在执行 argparse 示例程序... 你好,测试用户! 你今年30岁了。 你正值壮年! 你来自上海 --- 详细信息 --- 程序名称: /Applications/0ENZO/Installs/anaconda3/anaconda3/bin/argparse-demo 解析到的参数: Namespace(name='测试用户',age=30,city='上海',verbose=True)感谢使用这个示例程序!# 4-安装后直接测试2(base)MacBook-Pro:python_setup_demo rong$ argparse-demo 测试用户 --city 上海正在执行 argparse 示例程序... 你好,测试用户! 你来自上海(base)MacBook-Pro:python_setup_demo rong$whichargparse-demo /Applications/0ENZO/Installs/anaconda3/anaconda3/bin/argparse-demo(base)MacBook-Pro:python_setup_demo rong$ argparse-demo --version 正在执行 argparse 示例程序... argparse-demo1.0.0# 5-展示安装目录-查询setup中的name(这个才是文件夹)(base)MacBook-Pro:python_setup_demo rong$ pip show python-cli-examples Name: python-cli-examples Version:1.0.0 Summary: Python 命令行工具开发示例集合 Home-page: https://github.com/example/python-cli-examples Author: 开发者 Author-email: developer@example.com License: MIT Location: /Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages Requires: click, fire Required-by:# 6-展示安装目录-查询setup中命令行入口点-entry_points中console_scripts(这个其实是脚本)(base)MacBook-Pro:python_setup_demo rong$ pip show argparse-demo WARNING: Package(s)not found: argparse-demo# 7-脚本卸载(base)MacBook-Pro:python_setup_demo rong$ pip uninstall python-cli-examples Found existing installation: python-cli-examples1.0.0 Uninstalling python-cli-examples-1.0.0: Would remove: /Applications/0ENZO/Installs/anaconda3/anaconda3/bin/argparse-demo /Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages/argparse_01_simple.py /Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages/python_cli_examples-1.0.0.dist-info/* Proceed(Y/n)? y Successfully uninstalled python-cli-examples-1.0.02-项目说明
项目概述
本项目是一个基于 Pythonargparse模块的命令行工具示例项目,演示如何将 Python 脚本打包成可安装的命令行工具。
项目结构
python_setup_demo/ ├── setup.py # 包配置文件 ├── argparse_01_simple.py # 主要的命令行工具脚本 └── BUILD_GUIDE.md # 本编译指南文件说明
setup.py
- 作用: Python 包的构建和分发配置文件
- 包名:
python-cli-examples - 版本:
1.0.0 - 入口点:
argparse-demo命令将映射到argparse_01_simple:main
argparse_01_simple.py
- 功能: 演示 argparse 库的基本用法
- 入口函数:
main() - 支持的参数:
name(必需): 用户姓名-a, --age: 年龄信息-c, --city: 城市信息 (默认: “未知”)--verbose: 详细信息模式--version: 显示版本信息
编译和安装步骤
1. 环境要求
- Python >= 3.7
- pip (Python 包管理器)
2. 直接运行脚本
# 基本用法python argparse_01_simple.py 张三# 带可选参数python argparse_01_simple.py 张三 --age25--city 北京# 详细信息模式python argparse_01_simple.py 张三 --age25--city 北京 --verbose# 查看帮助python argparse_01_simple.py --help# 查看版本python argparse_01_simple.py --version3. 安装为可执行命令
方法一: 开发模式安装 (推荐用于开发)
# 在项目根目录下执行(测试环境)pipinstall-e.安装后,可以在任何位置使用命令:
argparse-demo 张三 --age25--city 北京方法二: 标准安装
# 在项目根目录下执行(正式安装)pipinstall.4. 构建分发包
4.1 安装构建工具
# 安装 setuptools 和 wheelpipinstallsetuptools wheel4.2 构建分发包
# 构建 source distribution 和 wheelpython setup.py sdist bdist_wheel构建完成后,会在dist/目录下生成以下文件:
python-cli-examples-1.0.0-py3-none-any.whl(wheel 包)python-cli-examples-1.0.0.tar.gz(源码包)
4.3 从分发包安装
# 从 wheel 包安装pipinstalldist/python-cli-examples-1.0.0-py3-none-any.whl# 或从源码包安装pipinstalldist/python-cli-examples-1.0.0.tar.gz5. 卸载
# 卸载已安装的包pip uninstall python-cli-examples测试验证
安装前测试
# 测试脚本是否正常运行python argparse_01_simple.py 测试用户 --age30--city 上海 --verbose安装后测试
# 测试命令行工具是否正确安装argparse-demo 测试用户 --age30--city 上海 --verbose# 检查命令是否在 PATH 中whichargparse-demo# 验证版本信息argparse-demo --version验证安装
# 检查包是否已安装pip show python-cli-examples# 检查入口点是否正确python -c"import argparse_01_simple; print(argparse_01_simple.__doc__)"注意: 本指南基于argparse_01_simple.py文件和相应的setup.py配置。如需修改项目结构或功能,请同步更新配置文件。
3-安装区别
1-pip install -e . 和 pip install . 的区别
pip install -e .和pip install .都是用于安装 Python 包的命令,但它们在安装方式和用途上有一些区别:
1.pip install .
- 含义:安装当前目录下的 Python 包。
- 工作原理:
- 这个命令会将当前目录下定义的包(通常是一个包含
setup.py文件的目录)安装到 Python 的环境中。 - 安装完成后,包会被复制到 Python 的
site-packages目录中。 - 之后,无论你在哪个目录下运行 Python,都可以直接导入这个包。
- 这个命令会将当前目录下定义的包(通常是一个包含
- 适用场景:
- 当你完成了一个包的开发,希望将其安装到环境中,以便在其他项目中使用时。
- 适合于“一次性”安装,即安装后不经常修改包的代码。
2.pip install -e .
- 含义:以“可编辑模式”安装当前目录下的 Python 包。
- 工作原理:
-e参数表示“editable”,即“可编辑模式”。- 这个命令不会将包的代码复制到
site-packages目录,而是会在site-packages中创建一个指向当前目录的链接。 - 这样,当你修改当前目录下的代码时,这些修改会立即反映到已安装的包中,无需重新安装。
- 适用场景:
- 当你正在开发一个包,并且需要频繁修改代码时。
- 这种方式可以让你在开发过程中实时看到代码修改的效果,而不需要每次修改后都重新安装包。
总结
pip install .:适合安装已经开发完成的包,安装后代码不会频繁修改。pip install -e .:适合开发过程中使用,方便实时测试代码修改的效果。