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

Python调用外部命令:5种方法详解与实例 | Python系统编程指南

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提供了多种调用外部命令的方法:

  1. 对于简单场景,os.system()os.popen()仍然可用
  2. Python 3.5+推荐使用subprocess.run()作为首选方法
  3. 需要高级控制时使用subprocess.Popen()
  4. 需要确保命令成功执行并获取输出时使用subprocess.check_output()

始终优先考虑安全性:避免命令注入攻击,使用参数列表而不是字符串拼接,并验证所有用户输入。

发表评论