🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【新手入门】使用Python的sys模块处理命令行参数!

要在电脑上通过命令提示符或 PowerShell 运行 Python,需要先下载并安装 Python。
如果你还没有安装,请参考Python安装与开发环境配置一文来完成安装。

“那个黑色的屏幕(终端)看起来有点吓人…”“感觉那是程序员用的东西,跟我没什么关系吧?”

你好!就在几个月前,我还是一个和你想法完全一样的零基础编程新手。在AI的帮助下,我独自搭建了两个网站(buyonjapan.com, copicode.com)。

在这个网站上,我会以一个新手的视角,分享我实际遇到的问题,以及成功解决问题时的那种“原来这样就行了!”的喜悦。

这次,我们来学习如何使用Python的`sys.argv`来处理命令行参数。学会之后,你就能像魔法师一样,用一个命令就能随心所欲地改变程序的行为。听起来可能很难,但别担心!只要复制粘贴本文的代码,你就能体验到“程序跑起来了!”的感动。让我们开始吧!


首先,“命令行参数”到底是什么? 🤔

在进入正题之前,我们先绕一小段路。我想很多人可能对“命令行参数”这个词不太熟悉。

平时,我们操作电脑都是用鼠标点击图标或按钮,对吧?这就是GUI(图形用户界面)

而与之相对的,在黑色屏幕上输入文字来发布命令的方式,就是CUI(字符用户界面),也就是我们常说的“命令行”。

所谓的命令行参数,就是在用CUI运行程序时,额外传递给程序的信息,相当于告诉程序:“嗨,程序老兄,这次就按这个设置来运行吧!”。你可以把它想象成给程序的“说明书”或“选项”。

使用它,你就不必每次都去修改程序代码,而是在运行时根据需要改变程序的行为,非常方便!


用Python接收参数的第一步:`sys.argv`

在Python中,接收命令行参数最基本的方法就是使用`sys`模块中的`argv`。

`sys`模块是Python自带的标准库(参考官方文档),所以你不需要额外安装任何东西,立即可用!

首先,让我们实际看看接收到的命令行参数在程序中是什么样子的。请将下面的代码保存为`show_args.py`文件。

<!-- show_args.py -->
import sys

print("--- 传递给程序的参数 ---")
print(sys.argv)
print(f"数据类型是 {type(sys.argv)}")

保存后,打开终端(Windows上是命令提示符或PowerShell),进入到该文件所在的目录,然后像下面这样运行它。

# 在终端中执行的命令
python show_args.py first-arg second 333

你应该会看到这样的结果显示出来。

--- 传递给程序的参数 ---
['show_args.py', 'first-arg', 'second', '333']
数据类型是 <class 'list'>

看了结果,`sys.argv`的真面目就清楚了。没错,它就是一个列表(list)

因为它是一个列表,所以你可以通过指定索引号,如`sys.argv[1]`、`sys.argv[2]`来取出单个参数。


常见的坑及对策 🚨

`sys.argv`虽然简单方便,但有两个新手容易掉进去的坑。我也华丽地掉进去过!不过,只要知道了对策就没什么好怕的了。

坑1:参数不够会导致错误 (`IndexError`)

举个例子,假设我们写一个程序,接收一个名字作为参数,然后打印一句问候。

<!-- greet.py -->
import sys

# 将第一个参数作为名字接收
name = sys.argv[1]

print(f"你好,{name}!")

如果我们正确地传递名字来运行这个程序…

# 正确的执行示例
python greet.py 小明
# 输出结果
# 你好,小明!

运行得很顺利!但如果我们不小心忘了传递参数就运行,会怎么样呢?

# 忘记传递参数的执行示例
python greet.py
# 输出结果
# Traceback (most recent call last):
#   File "greet.py", line 4, in <module>
#     name = sys.argv[1]
# IndexError: list index out of range

程序抛出了一个`IndexError: list index out of range`错误。这个错误的意思是“你指定的列表索引超出范围了!”。因为我们没有传递参数,`sys.argv`里就只有`['greet.py']`一项。也就是说,索引`1`根本不存在,所以当我们试图访问`sys.argv[1]`时,程序就报错了。

【对策】在程序的一开始,就检查参数的数量是否符合预期。我们可以用`len()`来获取列表的元素数量。

<!-- greet_safe.py (安全版本) -->
import sys

# sys.argv的元素数量等于“脚本名 + 参数数量”
# 我们需要1个参数,所以len(sys.argv)应该等于2
if len(sys.argv) != 2:
    print("错误:请指定一个名字。")
    print("用法:python greet_safe.py [你的名字]")
    sys.exit() # 在这里结束程序

# 能执行到这里,说明参数已经正确传递
name = sys.argv[1]

print(f"你好,{name}!")

坑2:所有参数都被当作“字符串”处理

另一个关键点是,`sys.argv`里的所有参数,即使看起来像数字,也全部是字符串(string)类型

例如,我们来写一个接收两个数字作为参数并求和的程序。

<!-- add_wrong.py (错误示例) -->
import sys

num1 = sys.argv[1] # 字符串 '100'
num2 = sys.argv[2] # 字符串 '50'

result = num1 + num2 # 这里会进行字符串拼接

print(f"{num1} + {num2} = {result}")

运行这个程序会得到意想不到的结果。

# 执行示例
python add_wrong.py 100 50

# 输出结果
# 100 + 50 = 10050

本以为会得到`150`,结果却是`10050`。这是因为程序只是简单地把字符串`'100'`和`'50'`拼接在了一起。

【对策】如果想把参数当作数字来计算,你需要使用`int()`或`float()`将字符串转换类型为数字(整数或浮点数)。此外,为了防止用户输入非数字字符,使用`try-except`来做错误处理是一种好的编程习惯。

<!-- add_correct.py (正确示例) -->
import sys

# 检查参数数量
if len(sys.argv) != 3:
    print("错误:请指定两个数字。")
    print("用法:python add_correct.py [数字1] [数字2]")
    sys.exit()

try:
    # 使用int()将字符串转换为整数
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
    
    result = num1 + num2
    print(f"{num1} + {num2} = {result}")

except ValueError:
    # 如果int()转换失败,会抛出ValueError
    print("错误:参数必须是半角数字。")

【进阶篇】一键复制粘贴,用参数自动生成HTML文件吧! ✨

好了,现在是重头戏!让我们活用至今所学,来创建一个非常适合Web创作者的实用程序吧。

这是一个“通过命令行参数接收‘名字’和‘喜欢的颜色’,然后自动生成一份包含专属问候信息的HTML文件”的程序。

请将下面的代码完整地复制粘贴,并保存为`create_html.py`文件。

<!-- create_html.py -->
import sys
import os

# --- 1. 检查参数 ---
# 需要“名字”和“喜欢的颜色”这两个参数
if len(sys.argv) != 3:
    print("[错误] 参数数量不正确。")
    print("[用法] python create_html.py [名字] [颜色代码或颜色名]")
    print("[示例] python create_html.py 张三 hotpink")
    sys.exit()

# --- 2. 将参数存入易于理解的变量中 ---
user_name = sys.argv[1]
fav_color = sys.argv[2]

# --- 3. 生成要写入HTML文件的内容 ---
# 使用f-string可以方便地在字符串中嵌入变量!
# 包含HTML/CSS/JS的完整代码
html_content = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>给{user_name}的特别信息</title>
    <style>
        body {{
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #121212;
            color: #ffffff;
        }}
        .card {{
            padding: 40px 60px;
            border-radius: 15px;
            text-align: center;
            border: 2px solid {fav_color};
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
            background-color: #1e1e1e;
        }}
        h1 {{
            margin: 0;
            font-size: 2.5em;
            /* 使用JavaScript应用颜色 */
        }}
        p {{
            margin-top: 10px;
            font-size: 1.2em;
            color: #cccccc;
        }}
    </style>
</head>
<body>
    <div class="card">
        <h1 id="greeting">你好,{user_name}!</h1>
        <p>你喜欢的颜色是<strong style="color: {fav_color};">{fav_color}</strong>,对吗!</p>
    </div>

    <script>
        // 来点好玩的,给文字加上渐变色
        const greeting = document.getElementById('greeting');
        greeting.style.background = `linear-gradient(45deg, {fav_color}, #ffffff)`;
        greeting.style.webkitBackgroundClip = 'text';
        greeting.style.color = 'transparent';
    </script>
</body>
</html>
"""

# --- 4. 写入文件 ---
# 文件名格式为“greet_名字.html”
file_name = f"greet_{user_name}.html"

try:
    with open(file_name, "w", encoding="utf-8") as f:
        f.write(html_content)
    
    # 显示成功信息
    # os.path.abspath()可以获取文件的完整路径
    full_path = os.path.abspath(file_name)
    print("🎉 成功生成HTML文件!")
    print(f"文件名: {file_name}")
    print(f"保存位置: {full_path}")
    print("快在浏览器里打开看看吧!")

except IOError as e:
    print(f"[错误] 文件写入失败: {e}")
    sys.exit()

准备好了吗?在终端里,用你的名字和你喜欢的颜色(CSS中可用的颜色名或颜色代码)作为参数来运行这个脚本吧!

# 执行示例(换成你自己的名字试试!)
python create_html.py 小红 "rgb(102, 157, 246)"

运行后,终端会显示成功信息。

🎉 成功生成HTML文件!
文件名: greet_小红.html
保存位置: /Users/yourname/path/to/greet_小红.html
快在浏览器里打开看看吧!

然后,在同一个文件夹里,应该会多出一个名为`greet_小红.html`的文件。双击这个HTML文件,在浏览器里打开它看看!

在浏览器中显示生成的HTML文件的示例。中央有一个卡片,上面有渐变色的标题写着“你好,小红!”,以及关于指定颜色的文本。

怎么样?只需一个命令,一份专属于你的网页就诞生了!这就是命令行参数的力量。只要准备好文件模板,你就可以通过改变名字、颜色、信息等,瞬间批量生产类似的文件。是不是很厉害?


总结:黑色屏幕也能成为你的好帮手

这次,我们结合我自己的踩坑经历,解说了如何使用Python的`sys.argv`来处理命令行参数。

命令行一开始可能让人觉得难以接近,但一旦和它混熟了,它就会成为你工作上最高效的伙伴。如果这篇文章能成为你迈向黑色屏幕世界的第一步,我将感到无比欣慰。

下一步

如果你对程序自动化产生了兴趣,下一步可以尝试控制程序的执行时机。使用Python的`time`模块,你可以让程序暂停一段时间(休眠),或者精确地测量一段代码的执行时间。

➡️ 使用time模块实现时间延迟和测量的方法