Python 命令行工具编译argparse

1-妇女之友-argparse
1-脚本代码
python
#!/usr/bin/env python3
"""
argparse 示例脚本
演示如何使用 Python 标准库 argparse 创建命令行工具
"""
import argparse
import sys
def create_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"
)
return parser
def main():
"""主函数"""
print("正在执行 argparse 示例程序...")
parser = create_parser()
args = parser.parse_args()
# 基本问候
print(f"你好,{args.name}!")
# 如果有年龄参数
if args.age:
print(f"你今年{args.age}岁了。")
# 年龄分类
if args.age < 18:
print("你还是个未成年人士!")
elif args.age < 30:
print("你正处于青壮年时期!")
elif args.age < 50:
print("你正值壮年!")
else:
print("你已经步入中老年阶段!")
# 显示城市信息
print(f"你来自{args.city}")
# 详细信息模式
if args.verbose:
print("\n--- 详细信息 ---")
print(f"程序名称: {sys.argv[0]}")
print(f"解析到的参数: {args}")
print("感谢使用这个示例程序!")
if __name__ == "__main__":
main()
2-setup脚本
python
#!/usr/bin/env python3
"""
setup.py - Python 包配置文件
用于将命令行工具打包成可安装的包
"""
from setuptools import setup, find_packages
# 读取 README 文件(如果存在)
try:
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
except FileNotFoundError:
long_description = "Python 命令行工具示例项目"
# 读取 requirements.txt 文件(如果存在)
requirements = []
try:
with open("requirements.txt", "r", encoding="utf-8") as fh:
requirements = [line.strip() for line in fh if line.strip() and not line.startswith("#")]
except FileNotFoundError:
# 如果没有 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"],
},
# 项目 URL
project_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-项目测试
shell
# 1-目录文件展示
(base) MacBook-Pro:python_setup_demo rong$ ls
BUILD_GUIDE.md argparse_01_simple.py setup.py
# 2-原生脚本测试
(base) MacBook-Pro:python_setup_demo rong$ python argparse_01_simple.py 张三 -a 25 -c 北京
正在执行 argparse 示例程序...
你好,张三!
你今年25岁了。
你正处于青壮年时期!
你来自北京
# 3-安装执行脚本
(base) MacBook-Pro:python_setup_demo rong$ pip install .
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Processing /Users/rong/Documents/EnzoApplication/WorkSpace/Python/20251222_Python_Setup/python_setup_demo
Preparing metadata (setup.py) ... done
Requirement already satisfied: click>=8.0.0 in /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.0 in /Applications/0ENZO/Installs/anaconda3/anaconda3/lib/python3.10/site-packages (from python-cli-examples==1.0.0) (0.7.1)
Requirement already satisfied: termcolor in /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 wheels for collected packages: python-cli-examples
Building wheel for python-cli-examples (setup.py) ... done
Created wheel for python-cli-examples: filename=python_cli_examples-1.0.0-py3-none-any.whl size=3088 sha256=1e38d417b4c61a60b3acf3ecc8babb938f239f182dbd9b86b67640089ab52861
Stored in directory: /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 测试用户 --age 30 --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$ which argparse-demo
/Applications/0ENZO/Installs/anaconda3/anaconda3/bin/argparse-demo
(base) MacBook-Pro:python_setup_demo rong$ argparse-demo --version
正在执行 argparse 示例程序...
argparse-demo 1.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-examples 1.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.0
2-项目说明
项目概述
本项目是一个基于 Python argparse 模块的命令行工具示例项目,演示如何将 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. 直接运行脚本
bash
# 基本用法
python argparse_01_simple.py 张三
# 带可选参数
python argparse_01_simple.py 张三 --age 25 --city 北京
# 详细信息模式
python argparse_01_simple.py 张三 --age 25 --city 北京 --verbose
# 查看帮助
python argparse_01_simple.py --help
# 查看版本
python argparse_01_simple.py --version
3. 安装为可执行命令
方法一: 开发模式安装 (推荐用于开发)
bash
# 在项目根目录下执行(测试环境)
pip install -e .
安装后,可以在任何位置使用命令:
bash
argparse-demo 张三 --age 25 --city 北京
方法二: 标准安装
bash
# 在项目根目录下执行(正式安装)
pip install .
4. 构建分发包
4.1 安装构建工具
bash
# 安装 setuptools 和 wheel
pip install setuptools wheel
4.2 构建分发包
bash
# 构建 source distribution 和 wheel
python 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 从分发包安装
bash
# 从 wheel 包安装
pip install dist/python-cli-examples-1.0.0-py3-none-any.whl
# 或从源码包安装
pip install dist/python-cli-examples-1.0.0.tar.gz
5. 卸载
bash
# 卸载已安装的包
pip uninstall python-cli-examples
测试验证
安装前测试
bash
# 测试脚本是否正常运行
python argparse_01_simple.py 测试用户 --age 30 --city 上海 --verbose
安装后测试
bash
# 测试命令行工具是否正确安装
argparse-demo 测试用户 --age 30 --city 上海 --verbose
# 检查命令是否在 PATH 中
which argparse-demo
# 验证版本信息
argparse-demo --version
验证安装
bash
# 检查包是否已安装
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 .:适合开发过程中使用,方便实时测试代码修改的效果。