热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonsubprocess模块_pythonsubprocess模块详解

一、subprocess标准库python执行shell脚本,通常会使用so模块中的几个方法,如system、spawn*、popen等。subproc

一、subprocess标准库

python执行shell脚本,通常会使用so模块中的几个方法,如system、spawn*、popen等。subprocess标准库的引入就是为了取代这些老的模块方法。subprocess使用时,父进程创建子进程去执行一个外部程序,并提供了标准输入输出和管道(pipe)的实现方法。

subprocess.Popen()

subprocess库的一个基础类,下文介绍的subprocess.run、subprocess.call、subprocess.check_call、subprocess.check_output都是在此基础上的封装,若要实现一些复杂的业务流程使用subprocess.Popen()更灵活。

程序运行subprocess.Popen()类,父进程创建子进程后,不会等待子进程执行完成。如果需要等待子进程,需要加入wait()方法阻塞父进程。

示例1

child = subprocess.Popen('ping www.baidu.com')print('End')

示例2

child = subprocess.Popen('ping www.baidu.com')

child.wait()print('End')

以上示例1没有等child 执行完就print,示例2父进程先阻塞,等待child执行完再print。

subprocess.Popen(args, bufsize=-1, executable=None,stdin=None, stdout=None, stderr=None,preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,shell=False, cwd=None, env=None, universal_newlines=False,startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False,pass_fds=(), *, encoding=None, errors=None)

args:shell命令,可以是str类型,或者list和tuple

bufsize:缓冲区

stdin、stdout、stderr:标准输入输出和标准错误日志

subprocess.PIPE:创建Popen对象时,subprocess.PIPE可以初始化stdin、stdout、stderr参数。

标准输出:

importsubprocess

child= subprocess.Popen(['shell','python --version'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr=subprocess.PIPE)

shell_out=child.stdout.read()#shell_out = child.communicate() 也可以使用communicate()方法输出

shell_error =child.stderr.read()print(shell_out)print(shell_error)

其他方法:

child.poll() #检查子进程状态

child.kill()#终止子进程

child.send_signal()#向子进程发送信号

child.terminate()#终止子进程

subprocess.run()

subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例。

child = subprocess.run('python --version', shell =True)print(child)#CompletedProcess(args='python --version', returncode=0)

subprocess.call()

父进程等待子进程完成

执行成功返回0

执行失败returncode=2,不会主动抛error

child = subprocess.call('python --version', shell =True)print(child)#0

subprocess.check_call()

父进程等待子进程完成

执行成功返回0

returncode不为0,抛出subprocess.CalledProcessError:error信息只有returncode

child = subprocess.check_call('python --version', shell =True)print(child)#0

subprocess.check_output()

父进程等待子进程完成

执行成功返回output信息

returncode不为0,抛出subprocess.CalledProcessError:error信息包含returncode和output信息

child = subprocess.check_output('python --version', shell =True)print(child)#b'Python 3.6.4\r\n'



推荐阅读
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 在安装 iOS 开发所需的 CocoaPods 时,用户可能会遇到多种问题。其中一个常见问题是,在执行 `pod setup` 命令后,系统无法连接到 GitHub 以更新 CocoaPods/Specs 仓库。这可能是由于网络连接不稳定、GitHub 服务器暂时不可用或本地配置错误等原因导致。为解决此问题,建议检查网络连接、确保 GitHub API 限制未被触发,并验证本地配置文件是否正确。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 在CentOS 6.5环境中,本文详细介绍了如何配置SSH无密钥登录,并成功执行PSSH命令。首先,确保系统已安装PSSH工具,可使用 `yum install pssh` 进行安装。若未配置免密钥登录,PSSH命令将无法正常执行,例如尝试运行 `pssh -H root@192.168.245.129 -i uptime` 时会失败。通过生成并分发SSH公钥,可以实现无密码登录,从而顺利执行PSSH命令。此外,本文还提供了详细的步骤和常见问题的解决方案,帮助用户顺利完成配置。 ... [详细]
  • 本文详细解析了 LeetCode 第 94 题——二叉树的中序遍历,并提供了基础实现方法。通过具体的示例,如输入根节点 `[1, null, 2, 3]` 返回 `[1, 3, 2]`,以及空树输入返回空列表 `[]`,帮助读者理解中序遍历的原理和实现步骤。文章还介绍了递归和迭代两种常见的遍历方法,为初学者提供了清晰的学习路径。 ... [详细]
author-avatar
好好地经历这每一天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有