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系列之教你如何根据图片生成字符画
May 23 Python
Python实现程序的单一实例用法分析
Jun 03 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
浅析Python四种数据类型
Sep 26 Python
python实现邮件发送功能
Aug 10 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
pyCharm 实现关闭代码检查
Jun 09 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
利用python做表格数据处理
Apr 13 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
jquery动态添加option示例
2013/12/30 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python进程池Pool应用实例分析
2019/11/27 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
上课迟到检讨书
2014/01/19 职场文书
运动会入场解说词
2014/02/07 职场文书
舞蹈专业求职信
2014/06/13 职场文书
师范毕业生求职信
2014/07/11 职场文书
借名购房协议书范本
2014/10/06 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
python字典的元素访问实例详解
2021/07/21 Python
mysql脏页是什么
2021/07/26 MySQL
SQL中的连接查询详解
2022/06/21 SQL Server
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS