当前位置:首页 > Python > 正文

Python调用CMD命令教程 - 实用指南

Python调用CMD命令完全指南

本教程详细讲解Python中执行CMD命令的多种方法,包括os.system、os.popen和subprocess模块的使用,并提供实际代码示例和安全建议。

为什么需要在Python中调用CMD命令?

Python调用CMD命令在以下场景中非常有用:

  • 自动化系统管理任务(如文件操作、服务管理)
  • 执行外部程序或脚本
  • 与操作系统深度交互
  • 批量处理任务
  • 调用系统工具(ping, ipconfig等)

Python调用CMD命令的三种主要方法

1. os.system()

最简单的执行命令方法,直接执行并返回退出状态码。

✓ 使用简单,适合快速执行命令

✗ 无法获取命令输出

✗ 安全性较低

2. os.popen()

执行命令并返回一个文件对象,可以读取命令输出。

✓ 可以获取命令输出

✗ 不推荐使用(Python 3已被subprocess替代)

3. subprocess模块

Python官方推荐的方法,功能最全面最安全。

✓ 可以控制输入/输出/错误流

✓ 支持超时设置

✓ 安全性高

方法一:使用os.system()

os.system()是执行CMD命令最简单的方法,它会在子shell中执行命令并返回命令的退出状态码。

使用os.system执行命令
import os

# 执行简单的dir命令
exit_code = os.system('dir')

# 执行ping命令
os.system('ping -n 3 www.google.com')

# 获取命令执行结果(0表示成功)
print(f"命令执行状态: {exit_code}")

注意:os.system()方法无法捕获命令输出,只能获取退出状态码。对于需要输出内容的情况,请使用其他方法。

方法二:使用os.popen()

os.popen()方法可以执行命令并返回一个文件对象,通过该对象可以读取命令的输出。

使用os.popen读取命令输出
import os

# 执行命令并获取输出
output = os.popen('ipconfig').read()

# 打印命令输出
print("网络配置信息:")
print(output)

# 执行带参数的命令
disk_info = os.popen('wmic logicaldisk get caption, freespace, size').read()
print("磁盘信息:")
print(disk_info)

提示:虽然os.popen()可以获取命令输出,但在Python 3中更推荐使用subprocess模块,因为它提供了更强大的功能。

方法三:使用subprocess模块(推荐)

subprocess模块是Python中执行外部命令的首选方法,它提供了更灵活和安全的接口。

3.1 使用subprocess.run()(Python 3.5+)

基础用法:执行命令并获取结果
import subprocess

# 执行命令并等待完成
result = subprocess.run(
    ['ping', '-n', '3', 'www.baidu.com'],
    capture_output=True,  # 捕获输出
    text=True,            # 以文本形式返回
    check=True            # 检查命令执行状态(非零退出码抛出异常)
)

# 输出命令执行结果
print("返回码:", result.returncode)
print("标准输出:", result.stdout)
print("标准错误:", result.stderr)

3.2 处理命令输出

实时处理命令输出
import subprocess

# 执行命令并实时处理输出
process = subprocess.Popen(
    ['ping', '-n', '10', 'www.google.com'],
    stdout=subprocess.PIPE,
    text=True
)

# 逐行读取输出
print("开始ping测试:")
for line in process.stdout:
    print(line.strip())  # 实时处理每一行输出

# 等待命令执行完成
process.wait()
print(f"命令执行完成,返回码: {process.returncode}")

3.3 设置超时

为命令执行设置超时
import subprocess

try:
    # 执行可能长时间运行的命令
    result = subprocess.run(
        ['ping', '-n', '20', 'www.example.com'],
        timeout=5,  # 5秒后超时
        capture_output=True,
        text=True
    )
except subprocess.TimeoutExpired:
    print("命令执行超时,已终止")
    
# 处理超时后继续执行其他操作

安全注意事项

在执行外部命令时,务必考虑安全性问题:

命令注入风险:永远不要直接执行用户提供的输入,这可能导致命令注入攻击。

不安全的做法(避免使用)
# 危险!可能被恶意利用
user_input = input("请输入文件名: ")
os.system(f"del {user_input}")  # 如果用户输入"*.*"会删除所有文件
安全的做法(使用subprocess)
user_input = input("请输入文件名: ")

# 使用列表形式传递参数,避免命令注入
subprocess.run(['del', user_input])

常用CMD命令Python示例

功能 CMD命令 Python实现
列出目录内容 dir subprocess.run(['dir'], shell=True)
网络诊断 ping subprocess.run(['ping', '-n', '4', 'example.com'])
网络配置 ipconfig result = subprocess.run(['ipconfig'], capture_output=True, text=True)
系统信息 systeminfo subprocess.run('systeminfo', shell=True)
文件复制 copy subprocess.run(['copy', 'source.txt', 'dest.txt'], shell=True)
创建目录 mkdir subprocess.run(['mkdir', 'new_directory'])

总结与最佳实践

在Python中执行CMD命令时,请遵循以下建议:

  • 优先使用subprocess模块,特别是subprocess.run()方法
  • 避免使用os.system()和os.popen(),除非有特殊需求
  • 永远不要直接执行用户提供的字符串(防止命令注入)
  • 使用列表形式传递命令和参数
  • 为长时间运行的命令设置超时
  • 适当处理命令输出和错误流
  • 在Windows环境中使用shell=True时要格外小心

通过合理使用Python执行CMD命令,你可以创建强大的系统管理工具和自动化脚本,大大提高工作效率。

© 2023 Python命令行教程 | 本教程仅用于学习目的

发表评论