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 相关文章推荐
从零学Python之入门(三)序列
May 25 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
Python制作Windows系统服务
Mar 25 Python
Python实现的圆形绘制(画圆)示例
Jan 31 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python查找文件中包含中文的行方法
Dec 19 Python
python 实现倒排索引的方法
Dec 25 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
解决python tkinter界面卡死的问题
Jul 17 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
Python求解排列中的逆序数个数实例
May 03 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接口中interface存在的意义
2013/06/27 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
VBScript版代码高亮
2006/06/26 Javascript
禁止刷新,回退的JS
2006/11/25 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
学习YUI.Ext基础第一天
2007/03/10 Javascript
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
javascript闭包的理解
2015/04/01 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
2020/06/17 Javascript
python实现画圆功能
2018/01/25 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Python底层封装实现方法详解
2020/01/22 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
装饰资料员岗位职责
2013/12/30 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
2014年公司工作总结
2014/11/22 职场文书
付款承诺函范文
2015/01/21 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
活动主持人开场白
2015/05/28 职场文书
党员转正大会主持词
2015/07/02 职场文书
春节随笔
2015/08/15 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书