os.system() 的输出可以分为两个主要部分来理解:

- 函数的返回值:这是
os.system()执行后,Python 程序本身得到的结果。 - 命令的标准输出:这是你执行的命令(如
ls,dir,echo hello)在终端上打印的内容。
函数的返回值
os.system() 会执行一个 shell 命令,并在命令执行完毕后返回一个整数值,这个返回值包含了命令的执行状态信息,但它的解读方式因操作系统而异。
在 Windows 上
在 Windows 系统中,os.system() 的返回值就是命令行程序 cmd.exe 执行后的退出码(Exit Code)。
- 退出码为 0:通常表示命令成功执行。
- 非零退出码:通常表示命令执行失败,数字代表了不同的错误类型。
示例:
import os
# 执行一个成功的命令
return_code1 = os.system('echo Hello World')
print(f"命令 'echo Hello World' 的返回值是: {return_code1}")
# 执行一个失败的命令 (dir 不存在一个文件)
# 注意:在 cmd 中,dir 命令本身不会因为找不到文件而返回非零,我们用一个不存在的命令来演示
return_code2 = os.system('non_existent_command')
print(f"命令 'non_existent_command' 的返回值是: {return_code2}")
# 执行一个会出错的命令
return_code3 = os.system('mkdir C:\\Forbidden\\Folder')
print(f"命令 'mkdir C:\\Forbidden\\Folder' 的返回值是: {return_code3}")
输出可能类似于:

Hello World
命令 'echo Hello World' 的返回值是: 0
'non_existent_command' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
命令 'non_existent_command' 的返回值是: 1
系统找不到指定的路径。
命令 'mkdir C:\\Forbidden\\Folder' 的返回值是: 1
注意:你会看到命令的输出(如 Hello World 和错误信息)直接打印在了你的 Python 脚本的输出中,这是 os.system() 的一个重要特性。
在 Linux / macOS 上
在类 Unix 系统中,情况稍微复杂一些。os.system() 的返回值是一个 16 位的数字,其含义如下:
- 低 8 位 (位 0-7):是命令的退出码(Exit Code),这是你通常关心的部分,与 Windows 上的退出码含义相同(0 表示成功,非 0 表示失败)。
- 高 8 位 (位 8-15):包含了命令的终止信号信息,如果进程是被信号(如
SIGKILL,SIGTERM)终止的,这部分信息会告诉你具体是哪个信号。
要获取真正的退出码,你需要将返回值与 0xFF (即 255) 进行按位与 (&) 操作。
示例:

import os
# 执行一个成功的命令
return_code1 = os.system('ls') # 假设当前目录有文件
print(f"命令 'ls' 的原始返回值是: {return_code1}")
# 获取真正的退出码
exit_code1 = return_code1 & 0xFF
print(f"命令 'ls' 的退出码是: {exit_code1}")
# 执行一个失败的命令
return_code2 = os.system('ls /non_existent_path')
print(f"命令 'ls /non_existent_path' 的原始返回值是: {return_code2}")
exit_code2 = return_code2 & 0xFF
print(f"命令 'ls /non_existent_path' 的退出码是: {exit_code2}")
输出可能类似于:
file1.txt file2.py my_script.py
命令 'ls' 的原始返回值是: 0
命令 'ls' 的退出码是: 0
ls: cannot access '/non_existent_path': No such file or directory
命令 'ls /non_existent_path' 的原始返回值是: 512
命令 'ls /non_existent_path' 的退出码是: 0 # 注意:很多命令找不到文件时退出码也是0
注意:ls 命令在找不到文件时,其退出码通常是 2,上面的例子中,512 的二进制是 1000000000,低 8 位是 00000000,所以退出码是 0,这取决于具体命令的实现,如果用 grep 'something' non_existent_file,通常会得到 1 作为退出码。
命令的标准输出
这是 os.system() 最直观的输出行为:它会将执行命令的所有标准输出和标准错误直接打印到你当前的 Python 解释器的标准输出(通常是你的终端/控制台)上。
关键点:
- 实时输出:输出是实时打印的,而不是等整个命令执行完毕后一次性输出。
- 无法捕获:你无法通过
os.system()的返回值来获取这些输出内容,它们只是被“透传”到了你的屏幕上。
示例:
import os
# 这个命令会打印多行信息
print("--- 正在执行 'dir' 命令 ---")
os.system('dir') # 在 Windows 上
# os.system('ls -l') # 在 Linux/macOS 上
print("--- 'dir' 命令执行完毕 ---")
输出:
--- 正在执行 'dir' 命令 ---
...
2025-10-27 10:00 AM 123 a.txt
2025-10-27 10:01 AM 456 b.py
...
2 个文件 579 字节
...
--- 'dir' 命令执行完毕 ---
可以看到,dir 命令的输出被直接插入到了 print 语句之间。
总结与对比
| 特性 | os.system() |
|---|---|
| 功能 | 在子 shell 中执行命令。 |
| 返回值 | 一个整数,表示命令的执行状态(退出码),在 Unix 上需要 & 0xFF 来获取退出码。 |
| 标准输出 | 直接打印到终端,无法被 Python 程序捕获。 |
| 标准错误 | 直接打印到终端,无法被 Python 程序捕获。 |
| 优点 | 简单易用,适合快速执行命令并查看结果。 |
| 缺点 | 无法获取命令的输出结果进行后续处理;无法精细控制输入输出;安全性较低(如果命令字符串来自用户输入,可能有注入风险)。 |
何时使用 os.system(),何时使用替代方案?
-
使用
os.system()的情况:- 你只是想快速运行一个命令,并在屏幕上看到它的输出,不需要在 Python 程序中对这些输出做任何处理。
- 自动化一些简单的系统管理任务,或者调用一个有图形界面的程序。
-
应该使用替代方案的情况:
-
你需要捕获命令的输出:
- 使用
subprocess模块,这是现代 Python 中推荐的做法。 subprocess.run(['ls', '-l'], check=True, capture_output=True, text=True)可以捕获输出,并检查返回码。
- 使用
-
你需要更精细的控制:
- 重定向输入、输出、错误流,或者与子进程进行交互。
subprocess模块提供了强大的功能来实现这些。
-
你需要更好的安全性:
- 如果命令的任何部分来自用户输入,使用
os.system()可能导致命令注入攻击。subprocess模块通过将命令和参数作为列表传递,可以更好地处理这个问题。
- 如果命令的任何部分来自用户输入,使用
-
os.system() 的输出分为两部分:一个是返回值(用于检查命令是否成功),另一个是命令本身的打印内容(直接显示在屏幕上),虽然它简单,但由于其无法捕获输出的严重限制,在大多数需要与命令行交互的复杂场景中,subprocess 模块是更好的选择。
