Skip to content

在 Python 中执行 CMD 命令有多种方法,以下是几种常见场景的示例及详细说明:


1. 基础执行(无需获取输出)

使用 os.systemsubprocess.run 执行简单命令:

python
import os
import subprocess

# 方法1: os.system(直接执行命令,返回退出码)
exit_code = os.system("dir")  # Windows查看目录
print("退出码:", exit_code)  # 0 表示成功

# 方法2: subprocess.run(更灵活)
result = subprocess.run(["echo", "Hello, CMD!"], shell=True)
print("退出码:", result.returncode)

2. 获取命令输出

使用 subprocess.run 捕获命令的标准输出和错误:

python
import subprocess

# 执行命令并捕获输出
result = subprocess.run(
    ["ipconfig"],
    shell=True,
    capture_output=True,  # 捕获输出
    text=True  # 返回字符串而非字节
)

# 输出结果
print("标准输出:\n", result.stdout)
print("标准错误:\n", result.stderr)
print("退出码:", result.returncode)

3. 执行带参数的命令

处理带参数的命令(推荐使用列表传参避免注入风险):

python
import subprocess

# 安全方式(参数拆分为列表)
subprocess.run(["ping", "www.baidu.com", "-n", "4"], shell=True)

# 危险方式(直接拼接字符串,存在注入风险)
user_input = "example.com & del *.*"  # 恶意输入
subprocess.run(f"ping {user_input}", shell=True)  # 可能执行危险操作!

4. 处理管理员权限(Windows)

以管理员身份运行命令(弹出 UAC 确认窗口):

python
import ctypes

# 检查是否已是管理员
if not ctypes.windll.shell32.IsUserAnAdmin():
    print("请以管理员权限运行此脚本!")
    exit()

# 执行需要管理员权限的命令(例如添加防火墙规则)
subprocess.run(
    'netsh advfirewall firewall add rule name="Test" dir=in action=block protocol=TCP localport=80',
    shell=True
)

5. 异步执行命令

使用 subprocess.Popen 启动后台进程并监控状态:

python
import subprocess
import time

# 启动后台进程(例如 ping 命令)
process = subprocess.Popen(["ping", "www.google.com", "-n", "10"], shell=True)

# 等待进程结束或超时
try:
    process.wait(timeout=5)  # 最多等待5秒
except subprocess.TimeoutExpired:
    print("命令执行超时!")
    process.kill()  # 强制终止进程

print("最终退出码:", process.poll())

6. 处理错误和异常

捕获命令执行中的错误:

python
import subprocess

try:
    # 执行可能失败的命令(例如访问不存在的文件)
    result = subprocess.run(
        ["type", "nonexistent_file.txt"],
        shell=True,
        check=True,  # 检查退出码(非0则抛异常)
        capture_output=True,
        text=True
    )
except subprocess.CalledProcessError as e:
    print(f"命令失败!退出码: {e.returncode}")
    print("错误输出:\n", e.stderr)

注意事项

  1. 跨平台兼容性

    • dir 是 Windows 命令,Linux/macOS 需改用 ls
    • 使用 sys.platform 判断系统:
      python
      import sys
      if sys.platform == "win32":
          command = "dir"
      else:
          command = "ls -l"
  2. 路径处理

    • 使用 os.path 处理路径分隔符:
      python
      import os
      path = os.path.join("folder", "file.txt")
      subprocess.run(["notepad", path], shell=True)
  3. 安全性

    • 避免直接拼接用户输入到命令中,防止命令注入攻击。

通过以上方法,你可以灵活地在 Python 中执行 CMD 命令并控制输入、输出和错误处理。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer