上一篇
Python调用外部命令:5种方法详解与实例 | Python系统编程指南
- Python
- 2025-08-06
- 1257
Python调用外部命令:5种方法详解与实例
在Python开发中,经常需要与操作系统交互并执行外部命令。无论是运行系统工具、调用其他程序还是自动化脚本任务,掌握调用外部命令的方法至关重要。本文将详细介绍Python中调用外部命令的5种主要方法,并提供实用示例。
文章目录
1. os.system() - 简单执行命令
os.system()
是执行外部命令最简单的方法,但功能有限。
特点:
- 执行命令并返回退出状态码
- 无法直接捕获命令输出
- 简单易用,适合简单场景
示例代码:
import os
# 执行简单的系统命令
return_code = os.system("ls -l")
# 打印命令的退出状态码
print("命令退出状态:", return_code)
2. os.popen() - 获取命令输出
os.popen()
可以执行命令并获取其输出内容。
特点:
- 返回文件对象,可读取命令输出
- 不支持错误流捕获
- Python 3中已被subprocess取代
示例代码:
import os
# 执行命令并获取输出
output = os.popen("date").read()
print("当前日期:", output)
3. subprocess.run() - 推荐方法
Python 3.5+ 引入了 subprocess.run()
,这是目前执行外部命令的推荐方法。
特点:
- 灵活控制输入/输出/错误流
- 支持超时设置
- 返回包含结果的CompletedProcess对象
- Python官方推荐方法
示例代码:
import subprocess
# 执行命令并捕获输出
result = subprocess.run(
["ls", "-l", "/"],
capture_output=True,
text=True,
check=True
)
# 输出结果
print("返回码:", result.returncode)
print("标准输出:\n", result.stdout)
print("标准错误:", result.stderr)
高级用法:
# 带超时和输入的命令执行
try:
result = subprocess.run(
["grep", "python"],
input="Welcome to Python programming\nPython is awesome!",
capture_output=True,
text=True,
timeout=5
)
print("找到的内容:", result.stdout)
except subprocess.TimeoutExpired:
print("命令执行超时!")
4. subprocess.Popen() - 高级控制
对于需要更精细控制的场景,可以使用 subprocess.Popen
类。
适用场景:
- 需要与子进程交互(发送输入,读取输出)
- 执行长时间运行的后台任务
- 并行执行多个命令
示例代码:
import subprocess
# 启动进程
process = subprocess.Popen(
["python", "-c", "import time; [print(i) for i in range(5)]; time.sleep(2)"],
stdout=subprocess.PIPE,
text=True
)
# 实时读取输出
for line in process.stdout:
print(f"收到输出: {line.strip()}")
# 等待进程结束
return_code = process.wait()
print(f"进程结束,返回码: {return_code}")
5. subprocess.check_output() - 获取输出
check_output()
专门用于获取命令输出,并在非零退出码时抛出异常。
示例代码:
import subprocess
try:
# 获取命令输出
output = subprocess.check_output(
["echo", "Hello, Python!"],
text=True
)
print("命令输出:", output)
# 检查命令是否成功
disk_usage = subprocess.check_output(
["df", "-h", "/"],
text=True
)
print("磁盘使用情况:\n", disk_usage)
except subprocess.CalledProcessError as e:
print(f"命令执行失败,返回码 {e.returncode}")
最佳实践与安全注意事项
安全实践
- 避免使用
shell=True
,防止命令注入攻击 - 使用参数列表而不是拼接字符串
- 验证和清理用户输入
- 设置合理的超时时间
性能与健壮性
- 使用
subprocess.run()
替代旧方法 - 处理命令可能失败的情况
- 使用
text=True
获取字符串而非字节 - 考虑跨平台兼容性
方法选择指南
场景 | 推荐方法 |
---|---|
简单命令,不关心输出 | os.system() |
需要获取输出 | subprocess.run() |
与进程交互 | subprocess.Popen() |
需要确保命令成功 | subprocess.check_output() |
总结
Python提供了多种调用外部命令的方法:
- 对于简单场景,
os.system()
和os.popen()
仍然可用 - Python 3.5+推荐使用
subprocess.run()
作为首选方法 - 需要高级控制时使用
subprocess.Popen()
- 需要确保命令成功执行并获取输出时使用
subprocess.check_output()
始终优先考虑安全性:避免命令注入攻击,使用参数列表而不是字符串拼接,并验证所有用户输入。
本文由ShangguanDe于2025-08-06发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20257467.html
发表评论