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

Python执行CMD命令的完整教程 - 从入门到精通

Python执行CMD命令的完整教程

本教程将教你如何在Python中执行CMD命令,涵盖多种方法及其适用场景。通过学习,你将掌握使用os和subprocess模块运行命令、获取输出以及处理错误等实用技能。

为什么需要在Python中执行CMD命令?

Python执行CMD命令在以下场景非常有用:

  • 自动化系统管理任务
  • 调用外部程序或脚本
  • 批量处理文件操作
  • 集成第三方命令行工具
  • 执行系统诊断和监控

使用os模块执行命令

Python的os模块提供了基本的命令执行功能:

方法1: os.system()
import os

# 执行简单的命令
os.system("dir")  # Windows
os.system("ls")   # Linux/Mac

# 执行带参数的命令
os.system("ping www.baidu.com")

# 获取命令返回值
return_code = os.system("echo Hello, World!")
print(f"命令返回码: {return_code}")
方法2: os.popen()
import os

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

# 执行命令并逐行处理结果
with os.popen("systeminfo") as stream:
    for line in stream:
        if "OS 名称" in line:
            print(line.strip())

使用subprocess模块(推荐)

subprocess模块提供了更强大和灵活的命令执行功能:

方法1: subprocess.run()
import subprocess

# 基本用法
result = subprocess.run(["ping", "www.baidu.com"], capture_output=True, text=True)
print(result.stdout)

# 获取返回码
if result.returncode == 0:
    print("命令执行成功!")
else:
    print(f"命令执行失败,错误码: {result.returncode}")

# 超时控制
try:
    result = subprocess.run(["ping", "www.baidu.com", "-t"], timeout=5)
except subprocess.TimeoutExpired:
    print("命令执行超时!")
方法2: subprocess.Popen()
import subprocess

# 执行命令并实时获取输出
process = subprocess.Popen(
    ["python", "-c", "import time; [print(i) or time.sleep(0.5) for i in range(5)]"],
    stdout=subprocess.PIPE,
    text=True
)

# 实时读取输出
while True:
    output = process.stdout.readline()
    if output == '' and process.poll() is not None:
        break
    if output:
        print(output.strip())

# 等待命令完成
return_code = process.wait()
print(f"命令结束,返回码: {return_code}")
方法3: subprocess.check_output()
import subprocess

# 获取命令输出
try:
    output = subprocess.check_output(
        ["python", "--version"], 
        stderr=subprocess.STDOUT,
        text=True
    )
    print(f"Python版本信息: {output.strip()}")
    
except subprocess.CalledProcessError as e:
    print(f"命令执行错误: {e.output}")

不同方法的比较

方法 特点 适用场景
os.system() 简单易用,直接输出到控制台 快速测试和简单命令
os.popen() 可以获取命令输出 需要输出结果的简单命令
subprocess.run() 功能全面,推荐使用 大多数命令执行需求
subprocess.Popen() 灵活,支持异步操作 长时间运行或需要交互的命令
subprocess.check_output() 直接获取输出 只需要命令输出结果的场景

实用技巧和注意事项

1. 处理带空格的路径

# 错误方式(可能导致问题)
subprocess.run("C:/Program Files/App/app.exe")

# 正确方式
subprocess.run(["C:/Program Files/App/app.exe"])  # 作为列表的第一个元素
# 或者
subprocess.run(r'"C:\Program Files\App\app.exe"', shell=True)

2. 安全警告:命令注入风险

# 危险!不要这样使用
user_input = input("请输入文件名: ")
os.system(f"rm {user_input}")  # 用户可能输入恶意命令

# 安全做法:使用参数列表
user_input = input("请输入文件名: ")
subprocess.run(["rm", user_input])  # 安全

3. 设置工作目录

import subprocess

# 在指定目录中执行命令
result = subprocess.run(
    ["dir"],
    cwd="C:/MyProject",  # 设置工作目录
    capture_output=True,
    text=True
)
print(result.stdout)

4. 环境变量管理

import subprocess
import os

# 添加新的环境变量
env = os.environ.copy()
env["CUSTOM_PATH"] = "D:/Custom"

# 使用自定义环境执行命令
result = subprocess.run(
    ["echo", "%CUSTOM_PATH%"],
    env=env,
    capture_output=True,
    text=True,
    shell=True
)
print(result.stdout)

总结

在Python中执行CMD命令有多种方法,根据需求选择最合适的:

  • 对于简单命令,os.system()os.popen()足够使用
  • 对于大多数应用场景,推荐使用subprocess.run()
  • 需要实时交互或长时间运行的任务,使用subprocess.Popen()
  • 仅需要命令输出时,subprocess.check_output()很方便

始终注意:

  1. 避免使用shell=True,除非必要
  2. 永远不要直接拼接用户输入到命令中
  3. 处理命令执行超时和错误情况
  4. 为跨平台脚本考虑不同操作系统的命令差异

发表评论