在 Python 脚本开发中,命令行交互是实现灵活、自动化任务的关键。而 sys 模块中的 argv 属性,正是我们获取外部传入参数的核心工具。本文将深入讲解 sys.argv 的原理、用法、实战案例及常见误区。
一、什么是 sys 模块?
sys(system)是 Python 内置模块,提供与 Python 解释器和操作系统交互的功能,例如:
- 获取命令行参数(sys.argv)
- 退出程序(sys.exit())
- 查看 Python 版本(sys.version)
- 修改模块搜索路径(sys.path)
无需安装:sys 是标准库,直接 import sys 即可使用。
二、核心:sys.argv 详解
1. 基本概念
- sys.argv 是一个列表(list),存储了运行脚本时传入的所有命令行参数
- 第一个元素 argv[0] 永远是脚本文件名本身
- 后续元素 argv[1], argv[2], … 是用户传入的参数
2. 语法格式
import sys
print("参数个数:", len(sys.argv))
print("所有参数:", sys.argv)
运行结果:

三、实战演示
示例 1:基础用法
创建文件 hello.py:
# hello.py
import sys
if len(sys.argv) < 2:
print("用法: python hello.py <姓名>")
sys.exit(1) # 非0表示异常退出
name = sys.argv[1]
print(f"你好, {name}!")
sys.exit(1) 主动终止程序并返回错误码
终端运行:

其次在pycharm的终端(terminal)输入命令符 python 绝对路径 参数,按下回车键运行:

⚠️注意:当传入参数大于程序所需参数时,程序按顺序接收所需参数。
命令提示符运行:
首先打开命令提示符窗口,然后进入hello.py文件所在磁盘,然后按格式输入命令符python 绝对路径 参数,最后按下回车键即可运行文件。

示例 2:多参数处理(计算器)
创建 calc.py:
# calc.py
import sys
if len(sys.argv) != 4:
print("用法: python calc.py <数字1> <操作符> <数字2>")
print("示例: python calc.py 3 + 5")
sys.exit(1)
num1 = float(sys.argv[1])
op = sys.argv[2]
num2 = float(sys.argv[3])
if op == '+':
result = num1 + num2
elif op == '-':
result = num1 – num2
elif op == '*':
result = num1 * num2
elif op == '/':
result = num1 / num2 if num2 != 0 else "错误:除数不能为0"
else:
print("仅支持 +, -, *, /")
sys.exit(1)
print(f"{num1} {op} {num2} = {result}")
运行效果:

示例 3:文件批量处理(实用场景)
# process_files.py
import sys
import os
if len(sys.argv) < 2:
print("用法: python process_files.py <文件1> [文件2] …")
sys.exit(1)
for filepath in sys.argv[1:]:
if os.path.exists(filepath):
size = os.path.getsize(filepath)
print(f"✅ {filepath}: {size} 字节")
else:
print(f"❌ 文件不存在: {filepath}")
运行:
$ python process_files.py report.pdf data.csv config.txt
✅ report.pdf: 245760 字节
✅ data.csv: 10240 字节
❌ 文件不存在: config.txt
四、常见误区与注意事项
误区 1:忘记 argv[0] 是脚本名
# 错误写法
name = sys.argv[0] # 实际得到的是 "hello.py",不是用户输入!
正确索引:用户参数从 sys.argv[1] 开始
误区 2:未校验参数数量
# 危险代码!
name = sys.argv[1] # 若未传参,会报 IndexError
安全做法:
if len(sys.argv) < 2:
print("缺少必要参数!")
sys.exit(1)
误区 3:参数类型未转换
sys.argv 中所有元素都是 字符串类型!
# 错误:直接相加会拼接字符串
a = sys.argv[1] # "3"
b = sys.argv[2] # "5"
print(a + b) # 输出 "35" 而非 8
# 正确:转换为数字
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b) # 输出 8
五、sys.argv vs argparse(进阶替代方案)
当参数复杂时(如带选项 -v, –output),推荐使用 argparse:
| 简单位置参数 | ✅ 足够 | ✅ 支持 |
| 选项参数(如 -h) | ❌ 需手动解析 | ✅ 原生支持 |
| 自动生成帮助文档 | ❌ 需手写 | ✅ 自动 –help |
| 类型自动转换 | ❌ 需手动 | ✅ 内置 |
argparse 示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name", help="你的名字")
parser.add_argument("-a", "–age", type=int, default=18)
args = parser.parse_args()
print(f"你好 {args.name}, 年龄 {args.age}")
运行:

💡 建议:
- 简单脚本 → 用 sys.argv
- 复杂工具 → 用 argparse
六、sys.argv 典型应用场景
| 自动化脚本 | 批量处理不同文件/目录 |
| 数据管道 | 接收上游任务的输出路径 |
| 配置切换 | 通过参数指定环境(dev/test/prod) |
| CI/CD 集成 | 在 Jenkins/GitHub Actions 中传参 |
七、总结
| sys.argv[0] | 永远是脚本文件名 |
| 用户参数 | 从 sys.argv[1] 开始 |
| 类型 | 所有参数均为字符串,需手动转换 |
| 安全校验 | 必须检查 len(sys.argv) |
| 退出控制 | 用 sys.exit(0) 成功退出,sys.exit(1) 异常退出 |
口诀:
“argv[0] 是自己,参数从1起;数量先校验,类型要转齐!”





