Python命令行工具argparse

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 .:适合开发过程中使用,方便实时测试代码修改的效果。

相关推荐
篱笆院的狗2 小时前
Java 中线程之间如何进行通信?
java·开发语言
lsx2024062 小时前
jQuery 密码验证
开发语言
创作者mateo2 小时前
python进阶之文件处理
开发语言·python
星月心城2 小时前
八股文-JavaScript(第一天)
开发语言·前端·javascript
Thomas_YXQ2 小时前
Unity3D的委托和事件的用法详解
java·开发语言
编程小Y2 小时前
Bash 替换机制
开发语言·chrome·bash
我要学脑机2 小时前
一个图谱映射到功能网络yeo7或17的解决方案
开发语言·网络·php
前端程序猿之路2 小时前
模型应用开发的基础工具与原理之Web 框架
前端·python·语言模型·学习方法·web·ai编程·改行学it