跳到主要内容Python 操作 CMD 命令行详解与实战 | 极客日志Python
Python 操作 CMD 命令行详解与实战
Python 通过 os、subprocess 和 shutil 等标准库提供操作系统交互能力。本文详解如何使用这些模块执行命令、获取输出、管理文件及处理错误。涵盖跨平台兼容性、安全性分析及最佳实践,帮助开发者高效实现命令行自动化控制。
PhpPioneer0 浏览 Python 操作 CMD 命令行详解与实战
引言
命令行界面(Command Line Interface,简称 CLI)是计算机操作系统中一种基于文本的用户界面,通过输入命令来与计算机进行交互。在自动化运维、脚本编写及系统管理场景中,CLI 的高效性无可替代。Python 作为一门强大的编程语言,提供了丰富的标准库和模块,可以方便地操作 CMD 或 Shell,实现复杂的系统控制任务。
本文将详细介绍如何使用 Python 的 os、subprocess 和 等模块来操作命令行,涵盖基础执行、输出捕获、文件管理及安全性分析,助您高效掌握命令行控制能力。
shutil
一、Python 中的 os 模块
os 模块是 Python 中用于提供与操作系统进行交互接口的一个标准库。它封装了常用的操作系统功能,如路径处理、进程启动、环境变量读取等。
1. 执行 CMD 命令
os 模块提供了 os.system(command) 函数来执行 CMD 命令。该函数会阻塞当前程序直到命令执行完毕,并返回命令的退出状态码。
import os
exit_code = os.system("ping www.example.com")
print(f"命令执行结束,退出码:{exit_code}")
注意:os.system 默认使用系统的 shell 解释器,存在命令注入风险。在处理用户输入时,建议优先使用 subprocess 模块。
2. 获取当前目录与环境变量
使用 os.getcwd() 可获取当前工作目录,os.environ 可访问环境变量。
import os
current_dir = os.getcwd()
print(f"当前目录:{current_dir}")
path_var = os.environ.get('PATH', '')
print(f"系统 PATH 长度:{len(path_var)}")
3. 创建和删除文件夹
使用 os.mkdir(path) 创建单级文件夹,os.makedirs(path, exist_ok=True) 创建多级文件夹。删除文件夹需使用 os.rmdir(path)(仅空目录)或配合 shutil。
import os
try:
os.mkdir("test_dir")
print("文件夹创建成功")
except FileExistsError:
print("文件夹已存在")
if os.path.exists("test_dir") and not os.listdir("test_dir"):
os.rmdir("test_dir")
二、Python 中的 subprocess 模块
subprocess 模块是 Python 中用于创建新进程、连接到子进程并与其进行通信的标准库。相比 os.system,它更灵活、安全,支持流式读写、超时控制和错误处理。
1. 获取 CMD 命令的输出
使用 subprocess.run() 是最推荐的方式。参数 capture_output=True 表示捕获标准输出和标准错误,text=True 确保返回字符串而非字节。
import subprocess
result = subprocess.run(
["dir"],
capture_output=True,
text=True,
encoding='gbk'
)
if result.returncode == 0:
print(result.stdout)
else:
print(f"错误信息:{result.stderr}")
2. 向 CMD 写入输入
部分命令需要交互式输入,可通过 input 参数传递数据。
import subprocess
result = subprocess.run(
["echo", "Hello World"],
input="www.example.com",
capture_output=True,
text=True
)
print(result.stdout.strip())
3. 高级用法:Popen 与管道
对于需要实时交互或后台运行的进程,可使用 subprocess.Popen。
import subprocess
proc = subprocess.Popen(["ping", "8.8.8.8"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
print(stdout.decode())
三、Python 中的 shutil 模块
shutil 模块提供了高层文件操作接口,常用于复制、移动、删除文件和文件夹,比直接调用底层 API 更安全便捷。
1. 复制文件和文件夹
shutil.copy(src, dst) 复制文件内容,shutil.copytree(src, dst) 递归复制整个目录树。
import shutil
import os
os.makedirs("test", exist_ok=True)
try:
shutil.copy("example.txt", "test/")
print("文件复制成功")
except FileNotFoundError:
print("源文件不存在")
2. 移动文件和文件夹
shutil.move(src, dst) 将文件或文件夹移动到指定位置,若目标在同一磁盘则重命名,跨盘则复制后删除原文件。
import shutil
shutil.move("example.txt", "test/example_moved.txt")
3. 删除文件和文件夹
shutil.rmtree(path) 可删除非空文件夹及其所有内容,os.remove(path) 仅删除文件。
import os
import shutil
if os.path.isfile("example.txt"):
os.remove("example.txt")
if os.path.isdir("test"):
shutil.rmtree("test")
四、安全性与最佳实践
1. 防止命令注入
在使用 subprocess 时,务必避免拼接字符串传递给 shell=True。始终使用列表形式传递参数。
user_input = "test; rm -rf /"
subprocess.run(f"echo {user_input}", shell=True)
subprocess.run(["echo", user_input])
2. 跨平台兼容性
Windows 使用 CMD/PowerShell,Linux/macOS 使用 Bash/Zsh。命令语法不同(如 dir vs ls),代码应做适配。
import platform
import subprocess
system = platform.system()
command = ["ls"] if system != "Windows" else ["dir"]
result = subprocess.run(command, capture_output=True, text=True)
print(result.stdout)
3. 异常处理与超时
长时间运行的命令可能导致程序挂起,应设置 timeout 参数。
import subprocess
try:
result = subprocess.run(
["sleep", "10"],
timeout=5,
capture_output=True,
text=True
)
except subprocess.TimeoutExpired:
print("命令执行超时")
五、总结
通过 Python 操作 CMD,我们可以方便地执行命令、获取输出、创建、复制、移动和删除文件和文件夹等操作。使用 os、subprocess 和 shutil 等模块,我们可以轻松玩转命令行控制,提高工作效率。
- 优先使用
subprocess 代替 os.system。
- 始终验证用户输入,防止命令注入。
- 处理编码问题,特别是在 Windows 环境下。
- 为长耗时命令添加超时机制。
希望本文能对您有所帮助,助您更好地使用 Python 进行系统管理与自动化控制。
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online