Python 命令行参数入门:sys.argv 详解

最近想动手写些小 Demo 练手,却发现一个麻烦事:每次修改程序参数,都要打开脚本改配置、改变量,反复运行测试太繁琐了。

其实咱们平时运行 Python 程序时,早就习惯了 python script.py 这样的命令行格式 —— 那有没有办法直接在命令行里给程序传递参数,不用每次都改代码呢?

带着这个疑问,我查了资料才知道,Python 内置了两种核心方案:sys.argvargparse。其中 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
2
3
4
5
6
# python_cmdline_sysargv_demo.py
import sys

# 打印 sys.argv 的内容和类型
print("sys.argv 的值:", sys.argv)
print("sys.argv 的类型:", type(sys.argv))

在命令行执行:

1
python python_cmdline_sysargv_demo.py name=harrison age=17 sex=man

运行结果:

1
2
sys.argv 的值: ['python_cmdline_sysargv_demo.py', 'name=harrison', 'age=17', 'sex=man']
sys.argv 的类型: <class 'list'>

看到结果是不是豁然开朗?核心结论:

  • sys.argv[0]:脚本本身的名称(是否为完整路径取决于操作系统);
  • sys.argv[1:]:用户传递的实际参数(列表切片即可获取);
  • 整个 sys.argv 是列表,其元素均为字符串(str)类型,支持所有列表操作(切片、循环、索引等)。

2. 特殊场景下的 argv[0]

官方文档提到两种特殊情况,逐一验证:

场景 1:使用 -c 选项执行字符串代码

Python 支持通过命令行直接执行「字符串形式的代码」,无需创建 .py 脚本,此时 argv[0]-c

命令行执行:

1
python -c "import sys; print(sys.argv)" hello world

运行结果:

1
['-c', 'hello', 'world']
场景 2:无脚本/无 -c 选项(交互式环境)

当仅输入 python 进入交互式命令行,未指定任何「执行入口」(无脚本、无 -c 字符串),此时 sys.argv[0] 为空字符串 '',相应的,sys.argv 列表为 ['']

交互式环境验证:

1
2
3
4
python
>>> import sys
>>> print(sys.argv)
['']

三、扩展:sys.orig_argv(Python 3.10+)

sys.orig_argv 是 Python 3.10 新增的模块属性,核心作用是 保存传递给 Python 解释器本身的原始完整命令行参数列表,与 sys.argv 的关键区别是:是否包含「解释器消费的参数」。

1. 两者对比示例

假设执行命令:

1
python3 -u -m python_cmdline_sysargv_demo.py --name test 123

此时两个属性的内容:

  • 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
2
3
4
5
6
7
8
# python_cmdline_sysargv_bytes_demo.py
import sys
import os

# 获取原始字节形式的命令行参数
raw_argv = [os.fsencode(arg) for arg in sys.argv]
print("原始字节参数:", raw_argv)
print("字节参数类型:", type(raw_argv[0]))

命令行执行:

1
python python_cmdline_sysargv_bytes_demo.py name=harrison

运行结果(Unix 系统):

1
2
原始字节参数: [b'python_cmdline_sysargv_bytes_demo.py', b'name=harrison']
字节参数类型: <class 'bytes'>

五、核心总结

  1. sys.argv 是命令行参数列表,argv[0] 为脚本名(特殊场景为 -c 或空字符串),argv[1:] 为用户传递的实际参数;
  2. 支持列表操作,适合简单的命令行参数传递场景;
  3. sys.orig_argv 保留完整原始参数,仅用于特殊调试/开发场景;
  4. Unix 系统中可通过 os.fsencode() 获取参数原始字节数据。

Python 命令行参数入门:sys.argv 详解
https://blog.qfmy.vip/python/sys-argv-introduction/
作者
Harrison
发布于
2025年11月29日
许可协议