Python下的subprocess模块的入门指引


Posted in Python onApril 16, 2015

在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了。

和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯。
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)

这堆东西真让人抓狂:

Python下的subprocess模块的入门指引

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()

Python下的subprocess模块的入门指引

Python 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
python中base64加密解密方法实例分析
May 16 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Python探索之修改Python搜索路径
Oct 25 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python读取properties配置文件操作示例
Mar 29 Python
浅述python2与python3的简单区别
Sep 19 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
numpy.random模块用法总结
May 27 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
Python下的twisted框架入门指引
Apr 15 #Python
Python代码调试的几种方法总结
Apr 15 #Python
详解Python中with语句的用法
Apr 15 #Python
python获取本机外网ip的方法
Apr 15 #Python
python中常用检测字符串相关函数汇总
Apr 15 #Python
python使用自定义user-agent抓取网页的方法
Apr 15 #Python
python使用urlparse分析网址中域名的方法
Apr 15 #Python
You might like
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
js删除数组中某几项的方法总结
2019/01/16 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python抓取网页内容示例分享
2014/02/24 Python
Python open()文件处理使用介绍
2014/11/30 Python
Python爬取读者并制作成PDF
2015/03/10 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Python通过select实现异步IO的方法
2015/06/04 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
使用Python封装excel操作指南
2021/01/29 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
小学教师寄语大全
2014/04/03 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js