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 相关文章推荐
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
python如何在循环引用中管理内存
Mar 20 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
Python测试模块doctest使用解析
Aug 10 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
利用Python脚本实现自动刷网课
Feb 03 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
使用python计算三角形的斜边例子
Apr 15 Python
python如何写出表白程序
Jun 01 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
Python如何使用神经网络进行简单文本分类
Feb 25 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
Linux下php5.4启动脚本
2014/08/03 PHP
PHP生成条形图的方法
2014/12/10 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
Python装饰器用法实例分析
2019/01/14 Python
Django model class Meta原理解析
2020/11/14 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
基督教婚礼主持词
2014/03/14 职场文书
小学一年级学生评语
2014/04/22 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
学习十八大的感悟
2015/08/11 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
create-react-app开发常用配置教程
2022/06/25 Javascript