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 实现在txt指定行追加文本的方法
Apr 29 Python
Python绘制3D图形
May 03 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
python中使用print输出中文的方法
Jul 16 Python
Python TestCase中的断言方法介绍
May 02 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
python读取Kafka实例
Dec 23 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
Pytorch 中的optimizer使用说明
Mar 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
德生PL330的评价与改造
2021/03/02 无线电
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP文件与目录操作示例
2016/12/24 PHP
PHP Include文件实例讲解
2019/02/15 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
vue ssr 指南详读
2018/06/29 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python切片知识解析
2016/03/06 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
flask入门之表单的实现
2018/07/18 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
上学路上观后感
2015/06/16 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang