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 相关文章推荐
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
python如何求解两数的最大公约数
Sep 27 Python
django 将model转换为字典的方法示例
Oct 16 Python
python仿抖音表白神器
Apr 08 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python selenium循环登陆网站的实现
Nov 04 Python
使用Python函数进行模块化的实现
Nov 15 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
Python Tornado核心及相关原理详解
Jun 24 Python
Python如何测试stdout输出
Aug 10 Python
python3操作redis实现List列表实例
Aug 04 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
SONY SRF-M100的电路分析
2021/03/02 无线电
PHP 常见郁闷问题答解
2006/11/25 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
js word表格动态添加代码
2010/06/07 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python 文件和输入输出小结
2013/10/09 Python
Python使用爬虫猜密码
2016/02/19 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
pow在python中的含义及用法
2019/07/11 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
Python中的全局变量如何理解
2020/06/04 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
python实现最短路径的实例方法
2020/07/19 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
opencv实现图像平移效果
2021/03/24 Python
篮球比赛口号
2014/06/10 职场文书
班风口号
2014/06/18 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js