4.3 Python3 sys命令行参数模块

sys 模块是 Python 标准库中用于访问与 Python 解释器紧密相关的变量和函数的模块,其中处理命令行参数是其重要功能之一。

pip install sys

目录

1. 基本命令行参数获取

1.1 sys.argv 列表

2. 命令行参数处理模式

2.1 简单参数处理

2.2 复杂参数处理(手动解析)

3. 专业参数处理推荐

3.1 使用 argparse 模块(Python 标准库)

3.2 使用第三方库 click

4. sys 模块其他相关功能

4.1 退出程序

​编辑

4.2 标准输入/输出/错误流

4.3 修改默认编码(Python 3早期版本可能需要)

5. 实际应用示例

5.1 文件处理脚本

6. 最佳实践


1. 基本命令行参数获取

1.1 sys.argv 列表

sys.argv 是一个包含命令行参数的列表,其中:

  • sys.argv[0] 是脚本名称

  • sys.argv[1] 是第一个参数

  • sys.argv[2] 是第二个参数

  • 以此类推...

示例脚本 args_demo.py:

import sys

print("脚本名称:", sys.argv[0])
print("参数数量:", len(sys.argv) - 1)
print("参数列表:", sys.argv[1:])

运行示例:

python args_demo.py arg1 arg2 arg3

输出:


2. 命令行参数处理模式

2.1 简单参数处理

import sys

if len(sys.argv) < 2:
    print("Usage: python script.py <input_file>")
    sys.exit(1)

input_file = sys.argv[1]
print(f"Processing file: {input_file}")

2.2 复杂参数处理(手动解析)

import sys

def process_args():
    options = {}
    args = []
    i = 1
    while i < len(sys.argv):
        arg = sys.argv[i]
        if arg.startswith('--'):
            # 处理长选项 --option=value 或 --option value
            if '=' in arg:
                key, value = arg.split('=', 1)
                options[key[2:]] = value
            else:
                if i + 1 < len(sys.argv) and not sys.argv[i+1].startswith('-'):
                    options[arg[2:]] = sys.argv[i+1]
                    i += 1
                else:
                    options[arg[2:]] = True
        elif arg.startswith('-'):
            # 处理短选项 -x value 或 -x
            if len(arg) > 2:  # 多个短选项组合 -abc
                for char in arg[1:]:
                    options[char] = True
            else:
                if i + 1 < len(sys.argv) and not sys.argv[i+1].startswith('-'):
                    options[arg[1:]] = sys.argv[i+1]
                    i += 1
                else:
                    options[arg[1:]] = True
        else:
            args.append(arg)
        i += 1
    return options, args

options, args = process_args()
print("Options:", options)
print("Arguments:", args)

3. 专业参数处理推荐

虽然可以手动处理参数,但对于复杂的命令行界面,推荐使用专门的库:

3.1 使用 argparse 模块(Python 标准库)

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

3.2 使用第三方库 click

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for _ in range(count):
        click.echo(f"Hello, {name}!")

if __name__ == '__main__':
    hello()


4. sys 模块其他相关功能

4.1 退出程序

import sys

user_input = input("请输入数字: ")

if not user_input.isdigit():
    sys.exit("错误:输入必须是数字") # 非零退出码表示错误
    # 或 sys.exit(1)

# 正常退出
sys.exit(0)

4.2 标准输入/输出/错误流

import sys

# 写入标准输出
sys.stdout.write("This goes to stdout\n")

# 从标准输入读取
input_data = sys.stdin.read()

# 写入标准错误
sys.stderr.write("This is an error message\n")

# 退出程序(0表示成功退出,非0表示错误退出)
sys.exit(0)  # 或者 sys.exit(1) 表示错误退出

4.3 修改默认编码(Python 3早期版本可能需要)

import sys
import io

# 修改标准输出的编码
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

5. 实际应用示例

5.1 文件处理脚本

import sys

def process_file(input_file, output_file):
    try:
        with open(input_file, 'r') as f_in, open(output_file, 'w') as f_out:
            for line in f_in:
                processed = line.strip().upper()
                f_out.write(processed + '\n')
        print(f"Successfully processed {input_file} to {output_file}")
    except Exception as e:
        sys.stderr.write(f"Error: {str(e)}\n")
        sys.exit(1)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        sys.stderr.write("Usage: python file_processor.py <input> <output>\n")
        sys.exit(1)
    
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    process_file(input_file, output_file)

6. 最佳实践

  1. 参数验证:始终验证参数数量和格式

  2. 用户友好:提供清晰的用法说明(--help)

  3. 错误处理:使用 sys.stderr 输出错误,非零退出码

  4. 模块化:将参数解析与业务逻辑分离

  5. 兼容性:考虑使用 argparse 以获得更好的兼容性和功能

  6. 安全性:处理文件路径时注意安全性


对于简单的脚本,sys.argv 足够使用;对于复杂的命令行工具,建议使用 argparse 或第三方库如 click 或 typer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值