杰瑞科技汇

Python argparse 如何实现下载功能?

什么是 argparse

argparse 的主要作用是:

Python argparse 如何实现下载功能?-图1
(图片来源网络,侵删)
  1. 定义参数:告诉你的程序它接受哪些命令行参数。
  2. 解析参数:当用户运行你的脚本并提供参数时,argparse 会自动解析这些参数。
  3. 生成帮助信息:自动生成像 python script.py -h 这样的帮助信息,告诉用户如何使用你的脚本。
  4. 错误处理:当用户提供了无效参数时,argparse 会自动报错并打印出帮助信息。

argparse 的基本使用步骤

使用 argparse 通常遵循以下三个步骤:

  1. 导入模块import argparse
  2. 创建解析器对象parser = argparse.ArgumentParser(description='...')
  3. 添加参数parser.add_argument('...')
  4. 解析参数args = parser.parse_args()

下面我们通过一个简单的例子来走一遍这个流程。

示例 1:一个简单的脚本

假设我们有一个脚本 greet.py,它接受一个名字作为参数,并打印一条问候语。

代码 (greet.py):

Python argparse 如何实现下载功能?-图2
(图片来源网络,侵删)
import argparse
# 1. 创建 ArgumentParser 对象
# description 参数会在帮助信息中显示在程序名称之后
parser = argparse.ArgumentParser(description="一个简单的问候脚本。")
# 2. 添加参数
# 'name' 是一个位置参数 (positional argument)
# help 参数提供了该参数的简短描述
parser.add_argument('name', type=str, help='要问候的人的名字')
# 3. 解析参数
# parse_args() 会从命令行读取参数,并返回一个包含这些参数的命名空间对象
args = parser.parse_args()
# 4. 使用解析到的参数
print(f"你好, {args.name}! 欢迎使用 argparse。")

如何运行:

打开终端或命令行,进入 greet.py 所在的目录。

  • 正常执行:

    python greet.py Alice

    输出:

    Python argparse 如何实现下载功能?-图3
    (图片来源网络,侵删)
    你好, Alice! 欢迎使用 argparse。
  • 查看帮助信息:

    python greet.py -h
    # 或者
    python greet.py --help

    输出:

    usage: greet.py [-h] name
    一个简单的问候脚本。
    positional arguments:
      name         要问候的人的名字
    options:
      -h, --help   show this help message and exit
  • 不提供参数(会报错):

    python greet.py

    输出:

    usage: greet.py [-h] name
    greet.py: error: the following arguments are required: name

argparse 的核心功能详解

argparse 的强大之处在于 add_argument() 方法,它允许你定义各种类型的参数。

位置参数

这些参数是必需的,它们的顺序由用户在命令行中提供的顺序决定,就像上面的 name 一样。

parser.add_argument('filename') # 用户必须提供一个文件名

可选参数

这些参数以 或 开头,是可选的

  • 短选项-f
  • 长选项--file

add_argument() 可以同时指定短选项和长选项。

parser.add_argument('-o', '--output', help='指定输出文件的路径')

如何运行:

# 使用短选项
python script.py -o result.txt
# 使用长选项
python script.py --output result.txt
# 不提供(args.output 将会是 None)
python script.py

参数类型

你可以强制参数为特定类型,如果类型不匹配,argparse 会自动报错。

  • type=int:必须是整数
  • type=float:必须是浮点数
  • type=str:默认就是字符串
  • type=bool:注意,布尔值比较特殊,通常用 action 来处理。
parser.add_argument('--count', type=int, help='一个整数计数')

如何运行:

python script.py --count 10  # 正确
python script.py --count ten
# 输出:
# usage: script.py [-h] [--count COUNT]
# script.py: error: argument --count: invalid int value: 'ten'

默认值

如果用户没有提供可选参数,可以为其设置一个默认值。

parser.add_argument('--verbose', '-v', action='store_true', default=False, help='启用详细输出')

这里我们使用了 action='store_true',这是一种更简洁的布尔值处理方式,如果用户提供了 -vargs.verbose 就会是 True,否则就是 False

互斥参数

有时,一组参数中只能选择一个。argparse 提供了 add_mutually_exclusive_group() 来实现这一点。

group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='启用详细输出')
group.add_argument('--quiet', action='store_true', help='禁用输出')

如何运行:

python script.py --verbose  # 正确
python script.py --quiet    # 正确
python script.py --verbose --quiet # 错误!会报错

选项参数

action 参数定义了当解析到某个参数时应该执行的操作,除了 store_true,还有:

  • store (默认):存储参数的值。
  • store_const:存储一个预先定义的常量,常量由 const 参数指定。
  • append:将参数的值添加到一个列表中,可以多次使用该参数。
  • count:计算参数出现的次数。-vv 会让 args.verbose 的值为 2
  • help:打印帮助信息并退出。
  • version:打印版本信息并退出。

示例 (appendversion):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--file', '-f', action='append', help='要处理的文件,可以多次指定')
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
args = parser.parse_args()
print("你提供的文件是:", args.file)

如何运行:

python script.py -f data1.txt -f data2.txt
# 输出:
# 你提供的文件是: ['data1.txt', 'data2.txt']
python script.py --version
# 输出:
# script.py 1.0

综合示例:一个功能更完整的脚本

让我们创建一个名为 downloader.py 的脚本,它可以下载指定 URL 的内容,并支持一些高级选项。

代码 (downloader.py):

import argparse
import requests # 需要先安装: pip install requests
def download_file(url, output_filename, chunk_size=8192):
    """下载文件并保存到本地"""
    try:
        print(f"正在从 {url} 下载...")
        with requests.get(url, stream=True) as r:
            r.raise_for_status() # 如果请求失败 (状态码不是 2xx), 则抛出异常
            with open(output_filename, 'wb') as f:
                for chunk in r.iter_content(chunk_size=chunk_size):
                    f.write(chunk)
        print(f"下载完成,已保存为 {output_filename}")
    except requests.exceptions.RequestException as e:
        print(f"下载失败: {e}")
def main():
    # 1. 创建解析器
    parser = argparse.ArgumentParser(
        description="一个简单的命令行文件下载工具。",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter # 显示默认值
    )
    # 2. 添加参数
    # --- 位置参数 ---
    parser.add_argument(
        'url',
        help='要下载文件的 URL'
    )
    # --- 可选参数 ---
    parser.add_argument(
        '-o', '--output',
        help='输出文件的名称',
        default='downloaded_file'
    )
    parser.add_argument(
        '-v', '--verbose',
        help='启用详细输出模式',
        action='store_true'
    )
    # --- 互斥参数组 ---
    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        '--quiet',
        help='静默模式,不打印任何信息',
        action='store_true'
    )
    group.add_argument(
        '--verbose',
        help='启用详细输出模式',
        action='store_true'
    )
    # --- 互斥参数组结束 ---
    # 3. 解析参数
    args = parser.parse_args()
    # 4. 使用参数
    if args.quiet:
        # 静默模式,什么都不打印
        pass
    elif args.verbose:
        print("详细模式已开启。")
        print(f"URL: {args.url}")
        print(f"输出文件名: {args.output}")
    download_file(args.url, args.output)
if __name__ == '__main__':
    main()

如何运行 downloader.py

# 1. 查看帮助
python downloader.py -h
# 2. 下载一张图片,默认文件名
python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png
# 3. 下载并指定输出文件名
python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png -o python_logo.png
# 4. 启用详细模式
python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png --verbose
# 5. 尝试静默模式
python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png --quiet

功能 方法/参数 描述
创建解析器 argparse.ArgumentParser() 创建一个参数解析器对象。
添加参数 add_argument() 向解析器添加一个参数定义。
位置参数 parser.add_argument('name') 必需参数,按位置匹配。
可选参数 parser.add_argument('-n', '--name') 可选参数,以 或 开头。
类型检查 type=int, type=float 强制参数转换为指定类型。
默认值 default='value' 如果参数未提供,则使用此默认值。
动作 action='store_true' 定义参数的行为,如存储布尔值、追加到列表等。
互斥参数 add_mutually_exclusive_group() 创建一组互斥的参数,只能选一个。
帮助信息 help='...' 为参数提供帮助文本。
解析参数 parse_args() 解析命令行输入,返回一个包含参数的 args 对象。

argparse 是 Python 脚本自动化的利器,掌握它能极大地提升你编写工具和脚本的效率和用户体验,从上面的例子可以看出,它非常直观且功能全面。

分享:
扫描分享到社交APP
上一篇
下一篇