博客
关于我
Python中执行外部命令
阅读量:796 次
发布时间:2023-03-09

本文共 2021 字,大约阅读时间需要 6 分钟。

Python中执行Shell命令与捕获输出的详细指南

在Python编程中,执行外部命令、启动子进程并捕获命令输出和退出状态码是常见需求。Java中的Runtime类库提供了类似的功能,而Python则通过subprocess模块实现了这一功能。subprocess模块不仅替代了传统的os模块中的系统函数,还提供了更高级别的接口,方便开发者进行操作。

1. subprocess模块的核心函数

subprocess模块提供了多种便利函数,能够满足不同场景的需求。以下是常用的函数:

  • subprocess.call:这是最简单的函数,用于执行命令。它返回命令的退出状态码。

  • subprocess.check_call:与call类似,但当命令失败时会抛出subprocess.CalledProcessError异常。

  • subprocess.check_output:这个函数最适合获取命令的输出结果。它会返回标准输出和错误输出。

  • subprocess.Popen:如果需要更高级别的控制,例如处理输入输出流,可以使用Popen类。

2. 使用subprocess.call

subprocess.call接受命令的形式,支持两种模式:shell模式和非shell模式。shell模式下,命令通过shell解释执行。

import subprocesssubprocess.call(['ls', '/etc'], shell=False)# 或者subprocess.call('ls /etc', shell=True)

注意:shell=True会增加命令的执行时间,因为会启动一个新的shell进程。

3. 处理命令错误输出

在使用check_output时,默认会将错误输出返回到标准输出。可以通过设置stderr参数为subprocess.STDOUT来将错误输出合并到标准输出中。

result = subprocess.check_output(['ls', '/zz'], stderr=subprocess.STDOUT)if result:    print('命令输出:', result.decode())

4. 使用Popen封装命令执行

如果需要对命令执行过程进行更详细的控制,可以使用Popen类。以下是一个封装函数的示例:

import subprocessdef execute_cmd(cmd):    p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)    stdout, stderr = p.communicate()    if p.returncode != 0:        return p.returncode, stderr    return p.returncode, stdout

解释:

  • subprocess.Popen创建了一个新的进程。
  • shell=True允许命令通过shell解释执行。
  • stdin, stdout, stderr参数分别控制输入输出流。
  • p.communicate()等待进程完成并返回结果。

5. 失败处理

在实际应用中,需要对命令的失败情况进行处理。可以通过检查返回码来判断命令是否成功。

def execute_cmd(cmd):    try:        returncode, output = execute_cmd(cmd)        if returncode != 0:            raise SystemExit(f'执行命令 {cmd} 失败: {output}')        else:            print(f'成功执行命令 {cmd}')    except subprocess.CalledProcessError as e:        print(f'执行命令 {cmd} 失败: {e.output}')

注意:在非shell模式下,subprocess.call和Popen会直接报错,而shell模式下则会返回错误输出。

6. 常见问题

  • 目录不存在时:如果命令执行时目录不存在,会抛出FileNotFoundError异常。

  • 权限不足:如果命令权限不足,会抛出PermissionError异常。

  • 超时处理:如果命令超时,可以通过设置timeout参数来限制执行时间。

  • 7. 总结

    通过subprocess模块,Python开发者可以轻松地执行外部命令、捕获输出并处理错误。选择合适的函数和参数可以根据具体需求实现不同的功能。无论是简单的call函数,还是复杂的Popen封装,都是实现任务的有效手段。

    转载地址:http://nplfk.baihongyu.com/

    你可能感兴趣的文章
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>
    Python写表情包搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Python-【1】配置
    查看>>
    Python-从子文件夹执行绝对导入
    查看>>
    Python-刷新页面,直到元素可单击
    查看>>