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网络爬虫实例讲解
Apr 28 Python
Python实现的选择排序算法示例
Nov 29 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
详解Python数据分析--Pandas知识点
Mar 23 Python
Python内置random模块生成随机数的方法
May 31 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
PHP 实用代码收集
2010/01/22 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP.vs.JAVA
2016/04/29 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
python多线程下信号处理程序示例
2019/05/31 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
python 6行代码制作月历生成器
2020/09/18 Python
公证书标准格式
2014/04/10 职场文书
三八节标语
2014/06/27 职场文书
国庆宣传标语
2014/06/30 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
法院授权委托书格式
2014/09/28 职场文书
房产公证书
2015/01/23 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python