python 中 subprocess.Popen 总结

2023-05-16

python 中 subprocess.Popen 总结

subprocess的目的就是启动一个新的进程并且与之通信。
subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:

subprocess.Popen(args, 
                bufsize=0, 
                executable=None, 
                stdin=None, 			                  
                stdout=None, 
                stderr=None, 
                preexec_fn=None, 
                close_fds=False, 
                shell=False, 
                cwd=None, 
                env=None, 
                universal_newlines=False, 
                startupinfo=None, 
                creationflags=0)

参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。

参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。

如果参数shell设为true,程序将通过shell来执行。

参数env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

subprocess.PIPE
  在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdoutstderr参数。表示与子进程通信的标准流。

subprocess.STDOUT
  创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。

Popen.wait()
  等待子进程结束。设置并返回returncode属性。
  
Popen.poll()
  用于检查子进程是否已经结束。设置并返回returncode属性。
  
Popen.kill()
  杀死子进程。
 
Popen.stdin,Popen.stdout ,Popen.stderr ,官方文档上这么说:
stdin, stdout and stderr specify the executed programs’ standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None.

Popen.pid
  获取子进程的进程ID。

Popen.returncode
  获取进程的返回值。如果进程还没有结束,返回None。
  
简单的用法:

import subprocess
p = subprocess.Popen("dir", shell=True)
p.wait()

shell参数根据你要执行的命令的情况来决定,上面是dir命令,就一定要shell=True了,p.wait()可以得到命令的返回值。
如果上面写成a=p.wait(),a就是returncode。那么输出a的话,有可能就是0【表示执行成功】。

进程通讯
如果想得到进程的输出,管道是个很方便的方法,这样:

import subprocess
p = subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, 		stderr=subprocess.PIPE)
(stdoutput, erroutput) = p.communicate()
print("communicate\n")
print(stdoutput[0:5], '    :    ', erroutput)

p.communicate会一直等到进程退出,并将标准输出和标准错误输出返回,这样就可以得到子进程的输出了。

如果你想一行行处理子进程的输出,也没有问题:

p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
    buff = p.stdout.readline()
    if buff == '' and p.poll() != None:
        break

死锁
但是如果你使用了管道,而又不去处理管道的输出,那么小心点,如果子进程输出数据过多,死锁就会发生了,比如下面的用法:

p=subprocess.Popen("longprint", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p.wait()

longprint是一个假想的有大量输出的进程,那么在我的xp, Python2.5的环境下,当输出达到4096时,死锁就发生了。当然,如果我们用p.stdout.readline或者p.communicate去清理输出,那么无论输出多少,死锁都是不会发生的。或者我们不使用管道,比如不做重定向,或者重定向到文件,也都是可以避免死锁的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中 subprocess.Popen 总结 的相关文章

随机推荐

  • CVTE嵌入式实习生与秋招

    目录 前言一 实习笔试二 实习面试三 实习工作内容四 公司看法 前言 今年暑假去CVTE实习了一个多月最后经过转正答辩 xff0c 获得了offer xff0c 现就我的实习经历和对公司的一些认知分享一下 xff08 仅代表个人观点 xff
  • 视频编解码行业及发展方向简述

    目录 一 视频行业1 视频是一个方兴未艾的大产业2 视频行业潜在商机大 人才缺口大3 了解华为海思的HI3518E方案 二 海思方案项目用到的硬件平台介绍1 本专栏文章使用的开发板配置2 处理器为什么选HI3518E 三 本专栏文章规划和核
  • 全面认识海思SDK及嵌入式层开发(1)

    目录 一 全面认识和检测配套开发套装1 套装配件介绍2 检测开发板3 注意 二 视频设备开发的技术流1 视频从产生到被消费的整个流程2 视频行业的商业角度分段3 几个疑问点 一 全面认识和检测配套开发套装 购买方式 xff1a 淘宝搜索 g
  • 嵌入式linux开发环境搭建(VMware16.0.0+Ubuntu16.04.3_X64)

    目录 一 安装VMware1 VMware介绍2 安装VMware16 0 0 二 安装ubuntu16 04 3 LTS1 Ubuntu介绍2 下载安装包iso3 安装 四 新安装Ubuntu的基本设置1 开机和关机等2 虚拟机基本设置3
  • 全面认识海思SDK及嵌入式层开发(2)

    目录 一 HI3518E方案系统整体架构介绍1 硬件上2 软件上 二 海思SDK的整体介绍三 海思SDK包的学习和实验1 2篇相关文档2 SDK包复制到linux原生目录中并解压3 SDK包操作的脚本程序研究4 SDK中源码包部分的配置编译
  • 计算机视觉之相机模型

    目录 一 相机模型1 相机与图像2 坐标系3 世界坐标系到摄像机坐标系4 摄像机坐标系到图像物理坐标系5 图像物理坐标系到图像像素坐标系6 摄像机坐标系到图像像素坐标系7 世界坐标系到图像像素坐标系 二 镜头畸变1 相机成像原理2 镜头畸变
  • vscode安装插件失败,完美解决

    vscode安装插件一直失败 xff0c 解决方案如下 访问vscode插件官网https marketplace visualstudio com vscode xff0c 搜索你要的插件点击插件详情 Version History 下载
  • ROS的topic通信机制

    1 通信步骤如图 xff1a 2 步骤介绍 第 xff08 0 xff09 步 xff1a talker gt master 发布者talker向mater注册 xff1a 包括节点的信息 需要发布的话题名等 xff0c 然后节点管理器RO
  • 关于快速幂和矩阵快速幂

    快速幂 xff1a 可参考该链接百科快速幂也可以参考这个博客快速幂博客 给出快速幂的题目和代码 xff1a 快速幂 取余计算 include lt iostream gt include lt string h gt using names
  • C/C++ 文件操作基础

    目录 1 文件分类 2 文件的打开与关闭 3 顺序读写文件 4 随机读写文件 5 其他与文件相关的操作 最近看 GNU Radio 源码看到了文件操作的部分 xff0c 因此记录下学习 C 43 43 C 操作文件的过程 本文的文件操作是
  • npm的装包原理

    原文 xff1a npm安装包原理 前言 xff1a 提起npm xff0c 大家第一个想到的应该就是 npm install 了 xff0c 但是 npm install 之后生成的 node modules大家有观察过吗 xff1f p
  • 02基于freertos实现串口通讯

    文章目录 一 操作步骤1 任务创建API2 步骤 二 代码 一 操作步骤 1 任务创建API 动态创建任务xTaskCreate 静态创建任务xTaskCreateStatic 任务句柄 xff1a 任务句柄就是一个指针 xff0c 指向任
  • windows中freeRTOS模拟器环境搭建

    windows中的freeRTOS使用 FreeRTOS参考手册中的模拟程序都是基于windows版本的模拟器 因此为了学习FreeRTOS xff0c 需要在Windows中搭建一下模拟器的运行环境 网络上的一般都是直接跑一下FreeRT
  • Xavier NX+4路Cameralink图像处理卡

    Xavier NX 43 4路Cameralink图像处理卡 M D CAP是天津雷航光电科技有限公司推出的一款复合加速计算平台 xff0c 由 NVidia GPU 和 Xilinx FPGA 通过PCIE 互联而成的高性能计算平台 其中
  • Xavier NX+KU040图像处理卡

    Xavier NX 43 KU040图像处理卡 CS NX21T是天津雷航光电科技有限公司推出的一款复合加速计算平台 xff0c 由 NVidia GPU 和 Xilinx FPGA 通过PCIE 互联而成的高性能计算平台 其中 FPGA
  • js使用input上传文件夹、拖拽上传文件夹并将文件夹结构展示为树形结构

    一 实现效果 左侧区域支持选择一个系统中的文件夹 xff0c 或者将文件夹拖拽到这个区域进行上传 xff0c 右侧区域可以将文件夹的结构展示为树形结构 二 代码实现 由于需要使用树形插件zTree xff0c 这个插件是依赖于jquery的
  • 傅里叶描述子、HOG特征描述子原理及matlab代码

    一 傅里叶描述子 傅里叶描述子的作用是用来描述图像的轮廓信息 xff0c 具有平移 旋转 尺度不变性特征 对于一幅图像 xff0c 通过傅里叶描述子获得其图像轮廓信息 xff0c 其本质就是空间 频域变换问题 通过将图像中的像素点进行傅里叶
  • raise ValueError(‘Expected input batch_size ({}) to match target batch_size ({}).‘

    raise ValueError Expected input batch size to match target batch size 记得在正向传播之前打印一下图片的尺寸 xff0c 这次没注意到图片其实都进来是 RGB 三通道的数据
  • RuntimeError mat1 dim 1 must match mat2 dim 0

    RuntimeError mat1 dim 1 must match mat2 dim 0 代码 self span class token punctuation span fc1 span class token operator 61
  • python 中 subprocess.Popen 总结

    python 中 subprocess Popen 总结 subprocess的目的就是启动一个新的进程并且与之通信 subprocess模块中只定义了一个类 Popen 可以使用Popen来创建进程 xff0c 并与进程进行复杂的交互 它