Python 命令行参数入门:sys.argv 详解
最近想动手写些小 Demo 练手,却发现一个麻烦事:每次修改程序参数,都要打开脚本改配置、改变量,反复运行测试太繁琐了。
其实咱们平时运行 Python 程序时,早就习惯了 python script.py 这样的命令行格式 —— 那有没有办法直接在命令行里给程序传递参数,不用每次都改代码呢?
带着这个疑问,我查了资料才知道,Python 内置了两种核心方案:sys.argv 和 argparse。其中 sys.argv 是最基础、最轻量化的选择,不用复杂配置就能实现简单的参数传递。
今天就从 sys.argv 入手,用实操 + 原理的方式,把这个基础工具讲透 —— 不管是写小脚本还是调试程序,掌握它都能大幅提升效率
一、sys.argv 是什么?
首先,看看官方文档是怎样说的:
传递给 Python 脚本的命令行参数列表。argv[0] 是脚本名称(其是否为完整路径名,取决于操作系统)。如果通过解释器的 -c 命令行选项执行指令,则 argv[0] 被设为字符串 ‘-c’。如果未向 Python 解释器传递脚本名称,则 argv[0] 为空字符串。
如需循环处理标准输入或命令行指定的文件列表,可参考 fileinput 模块。
另见 sys.orig_argv。
注意:在 Unix 系统中,命令行参数由操作系统以字节形式传递。Python 会使用文件系统编码(filesystem encoding)和 “surrogateescape” 错误处理器对其进行解码。若需获取原始字节数据,可通过以下方式获取:[os.fsencode(arg) for arg in sys.argv]
原文:
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string ‘-c’. If no script name was passed to the Python interpreter, argv[0] is the empty string.
To loop over the standard input, or the list of files given on the command line, see the fileinput module.
See also sys.orig_argv.
Note: On Unix, command line arguments are passed by bytes from OS. Python decodes them with filesystem encoding and “surrogateescape” error handler. When you need original bytes, you can get it by [os.fsencode(arg) for arg in sys.argv].
二、核心概念理解与实操
1. 本质:命令行参数的字符串列表
官方定义明确 sys.argv 是列表类型,咱们通过实操验证:
创建脚本文件 python_cmdline_sysargv_demo.py,内容如下:
1 | |
在命令行执行:
1 | |
运行结果:
1 | |
看到结果是不是豁然开朗?核心结论:
sys.argv[0]:脚本本身的名称(是否为完整路径取决于操作系统);sys.argv[1:]:用户传递的实际参数(列表切片即可获取);- 整个
sys.argv是列表,其元素均为字符串(str)类型,支持所有列表操作(切片、循环、索引等)。
2. 特殊场景下的 argv[0]
官方文档提到两种特殊情况,逐一验证:
场景 1:使用 -c 选项执行字符串代码
Python 支持通过命令行直接执行「字符串形式的代码」,无需创建 .py 脚本,此时 argv[0] 为 -c。
命令行执行:
1 | |
运行结果:
1 | |
场景 2:无脚本/无 -c 选项(交互式环境)
当仅输入 python 进入交互式命令行,未指定任何「执行入口」(无脚本、无 -c 字符串),此时 sys.argv[0] 为空字符串 '',相应的,sys.argv 列表为 ['']。
交互式环境验证:
1 | |
三、扩展:sys.orig_argv(Python 3.10+)
sys.orig_argv 是 Python 3.10 新增的模块属性,核心作用是 保存传递给 Python 解释器本身的原始完整命令行参数列表,与 sys.argv 的关键区别是:是否包含「解释器消费的参数」。
1. 两者对比示例
假设执行命令:
1 | |
此时两个属性的内容:
sys.orig_argv(原始完整参数):['python3', '-u', '-m', 'python_cmdline_sysargv_demo.py', '--name', 'test', '123']sys.argv(脚本接收的参数):['python_cmdline_sysargv_demo.py', '--name', 'test', '123'](少了-u和-m)
2. 关键定义
「解释器消费的参数」:指像 -u、-m、-c 这类由 Python 解释器自身处理的选项 —— 它们会被 sys.orig_argv 保留,但不会出现在 sys.argv 中。
3. 适用场景(极少用到)
- 调试复杂的解释器启动场景(比如用了
-m模块运行、-c执行字符串、自定义解释器选项时),需要确认解释器是否正确接收了所有参数; - 开发工具/框架时,需要获取用户启动 Python 时的完整命令(比如记录运行日志、复刻执行环境)。
四、Unix 系统的字节编码问题
官方提示:在 Unix 系统中,命令行参数由操作系统以字节形式传递,Python 会自动解码为字符串。若需获取原始字节数据,用 os.fsencode() 反向转换即可。
示例代码:
1 | |
命令行执行:
1 | |
运行结果(Unix 系统):
1 | |
五、核心总结
sys.argv是命令行参数列表,argv[0]为脚本名(特殊场景为-c或空字符串),argv[1:]为用户传递的实际参数;- 支持列表操作,适合简单的命令行参数传递场景;
sys.orig_argv保留完整原始参数,仅用于特殊调试/开发场景;- Unix 系统中可通过
os.fsencode()获取参数原始字节数据。