subprocess.Popen

这个模块主要就提供一个类Popen:

class 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

字符串或者列表

bufsize

0 无缓冲
1 行缓冲
其他正值 缓冲区大小
负值 采用默认系统缓冲(一般是全缓冲)

executable

一般不用吧,args字符串或列表第一项表示程序名

stdin
stdout
stderr

None 没有任何重定向,继承父进程
PIPE 创建管道
文件对象
文件描述符(整数)
stderr 还可以设置为 STDOUT

preexec_fn

钩子函数, 在fork和exec之间执行。(unix)

close_fds

unix 下执行新进程前是否关闭0/1/2之外的文件
windows下不继承还是继承父进程的文件描述符

shell

为真的话
unix下相当于args前面添加了 "/bin/sh“ ”-c”
window下,相当于添加"cmd.exe /c"

cwd

设置工作目录

env

设置环境变量

universal_newlines

各种换行符统一处理成 '\n'

startupinfo

window下传递给CreateProcess的结构体

creationflags

windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口

  • 当初最感到困扰的就是 args 参数。可以是一个字符串,可以是一个列表。
subprocess.Popen(["gedit","abc.txt"])
subprocess.Popen("gedit abc.txt")

这两个之中,后者将不会工作。因为如果是一个字符串的话,必须是程序的路径才可以。(考虑unix的api函数 exec,接受的是字符串列表)

  • 但是下面的可以工作
subprocess.Popen("gedit abc.txt", shell=True)

这是因为它相当于

subprocess.Popen(["/bin/sh", "-c", "gedit abc.txt"])

都成了sh的参数,就无所谓了

  • 在Windows下,下面的却又是可以工作的
subprocess.Popen(["notepad.exe", "abc.txt"])
subprocess.Popen("notepad.exe abc.txt")

这是由于windows下的api函数CreateProcess接受的是一个字符串。即使是列表形式的参数,也需要先合并成字符串再传递给api函数。

  • 类似上面
subprocess.Popen("notepad.exe abc.txt" shell=True)

等价于

subprocess.Popen("cmd.exe /C "+"notepad.exe abc.txt" shell=True)

subprocess.call*

模块还提供了几个便利函数(这本身也算是很好的Popen的使用例子了)

  • call() 执行程序,并等待它完成
def call(*popenargs, **kwargs):
    return Popen(*popenargs, **kwargs).wait()
  • check_call() 调用前面的call,如果返回值非零,则抛出异常
def check_call(*popenargs, **kwargs):
    retcode = call(*popenargs, **kwargs)
    if retcode:
        cmd = kwargs.get("args")
        raise CalledProcessError(retcode, cmd)
 return 0
  • check_output() 执行程序,并返回其标准输出
def check_output(*popenargs, **kwargs):
    process = Popen(*popenargs, stdout=PIPE, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
 cmd = kwargs.get("args")  raise CalledProcessError(retcode, cmd, output=output)  return output

Popen对象

该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()

poll()

检查是否结束,设置返回值

wait()

等待结束,设置返回值

communicate()

参数是标准输入,返回标准输出和标准出错

send_signal()

发送信号 (主要在unix下有用)

terminate()

终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess()

kill()

杀死进程(unix对应SIGKILL信号),windows下同上

stdin
stdout
stderr

参数中指定PIPE时,有用

pid

进程id

returncode

进程返回值

参考

转载于:https://www.cnblogs.com/zmlctt/p/4226584.html

python学习之subprocess模块相关推荐

  1. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. python学习总结----时间模块 and 虚拟环境(了解)

    python学习总结----时间模块 and 虚拟环境(了解) time- sleep:休眠指定的秒数(可以是小数) - time:获取时间戳# 获取时间戳(从1970-01-01 00:00:00到 ...

  3. Python学习笔记13_模块

    Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...

  4. Python学习笔记:模块

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. python学习,pip 模块-数据库(mysql)-excel操作-写日志-邮件-md5加密

    #模块 # 标准模块 # python自带的 # 第三方模块 # pymysql # 自己写的python文件 # 导入模块的实质 # import my_model # 把导入的模块运行了一遍 # ...

  6. Python学习 Day 025 -模块相关

    主要内容: 1. 模块 2. import 3. from xxx import xxx 1.模块    (1)模块的概述 模块就是一个包含了python定义和声明的文件, 文件名就是模块的名字加上. ...

  7. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  8. Python学习笔记——glob模块【文件、路径操作】

    最近做了一个将dicom文件转化为mhd文件的任务,由于要进行批量转化所以遍历文件夹必不可少,刚开始学习python编程,所以把用过的模块用法记录下来,以加深记忆,方便查阅,最后参考前人的博客做了gl ...

  9. Python 学习笔记 -- pickle模块,如何腌制泡菜(入门级)

    #关于腌菜的基础操作 #一般情况下学会腌菜的技术可以使文件大小更加小巧,更加持久. #下来是就是一些腌菜的基础用法 import pickle, os #在腌菜之前需要导入腌菜模块#实例一:这是一个保 ...

最新文章

  1. 关于seo优化的核心思想
  2. unable to contact ip driver
  3. JAVA 学到什么水平就可以转战 Android 了?
  4. 微软官方上线的Python教程,7个章节就把Python说通了!
  5. ROS笔记(14) URDF
  6. 4095: 韩信点兵
  7. Python知识点入门笔记——特色数据类型(字典)
  8. 音乐混音怎么做?教你完美制作野狼disco与周杰伦双节棍合唱!
  9. android 点击后退按钮,android – 按下后退按钮后重新选择正确的NavigationView菜单项...
  10. java json nf_什么是JSON ,API,GET,POST请求
  11. 个人游戏开发者是如何盈利
  12. yarn安装详细教程说明、升级教程、修改yarn的全局和缓存目录、yarn基本命令
  13. kubeedge源码分析
  14. Lombok 的作者,成功讨伐 IntelliJ IDEA!
  15. 详解交换机的GVRP
  16. NOIP(普及组):AK的故事之英语学习篇
  17. HBUOJ--走台阶
  18. 微博个人信息多维度详解
  19. quil-ediotr编辑器工具栏图表鼠标悬浮提示
  20. Java实现约瑟夫环问题

热门文章

  1. 统计字符串中单词个数
  2. Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
  3. python使用tkinter做界面之颜色
  4. 当session会话结束时,重定向到登录页显示在iframe框内的问题
  5. 网站用sqlite库,报attempt to write a readonly database,解决方法
  6. 如何加入Dave英语学习小组
  7. 关于JSON的简介及取值以及常见面试题
  8. SQL Server返回当前实例系统日期和时间的函数
  9. 今天,我种下了一朵小蓝花
  10. ubuntu安装VMware出错