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的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
Django与JS交互的示例代码
Aug 23 Python
pandas中Timestamp类用法详解
Dec 11 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
python之django母板页面的使用
Jul 03 Python
Django实现学生管理系统
Feb 26 Python
python判断无向图环是否存在的示例
Nov 22 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
python pymysql库的常用操作
Oct 16 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php简单实现数组分页的方法
2016/04/30 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript事件模型实例分析
2015/01/30 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
python从入门到精通(DAY 3)
2015/12/20 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python 排序算法总结及实例详解
2016/09/28 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
python实现K最近邻算法
2018/01/29 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Python tkinter和exe打包的方法
2020/02/05 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
函授大专自我鉴定
2013/11/01 职场文书
酒店经理职责
2014/01/30 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
Django如何与Ajax交互
2021/04/29 Python
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB