sys
模块是 Python 标准库中用于访问与 Python 解释器紧密相关的变量和函数的模块,其中处理命令行参数是其重要功能之一。
pip install sys
目录
3.1 使用 argparse 模块(Python 标准库)
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. 最佳实践
-
参数验证:始终验证参数数量和格式
-
用户友好:提供清晰的用法说明(--help)
-
错误处理:使用
sys.stderr
输出错误,非零退出码 -
模块化:将参数解析与业务逻辑分离
-
兼容性:考虑使用
argparse
以获得更好的兼容性和功能 -
安全性:处理文件路径时注意安全性
对于简单的脚本,sys.argv
足够使用;对于复杂的命令行工具,建议使用 argparse
或第三方库如 click
或 typer
。