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中关于日期时间处理的问答集锦
Mar 08 Python
python文件写入实例分析
Apr 08 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
Python中的sort()方法使用基础教程
Jan 08 Python
Python单元测试简单示例
Jul 03 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
信号生成及DFT的python实现方式
Feb 25 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
Python如何实现的二分查找算法
May 27 Python
浅谈Python协程
Jun 17 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
Python中json.dumps()函数的使用解析
May 17 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
常用的javascript设计模式
2017/01/11 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
python opencv实现运动检测
2018/07/10 Python
Python 忽略warning的输出方法
2018/10/18 Python
python实现图片筛选程序
2018/10/24 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
PyTorch中的Variable变量详解
2020/01/07 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2014年学生工作总结
2014/11/20 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
Redis主从复制操作和配置详情
2022/09/23 Redis