在 Python 中执行 CMD 命令有多种方法,以下是几种常见场景的示例及详细说明:
1. 基础执行(无需获取输出)
使用 os.system 或 subprocess.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)注意事项
跨平台兼容性:
dir是 Windows 命令,Linux/macOS 需改用ls。- 使用
sys.platform判断系统:pythonimport sys if sys.platform == "win32": command = "dir" else: command = "ls -l"
路径处理:
- 使用
os.path处理路径分隔符:pythonimport os path = os.path.join("folder", "file.txt") subprocess.run(["notepad", path], shell=True)
- 使用
安全性:
- 避免直接拼接用户输入到命令中,防止命令注入攻击。
通过以上方法,你可以灵活地在 Python 中执行 CMD 命令并控制输入、输出和错误处理。