python进程类subprocess的一些操作方法例子


Posted in Python onNovember 22, 2014

subprocess.Popen用来创建子进程。

1)Popen启动新的进程与父进程并行执行,默认父进程不等待新进程结束。

def TestPopen():

  import subprocess

  p=subprocess.Popen("dir",shell=True)

  for i in range(250) :

    print ("other things")

2)p.wait函数使得父进程等待新创建的进程运行结束,然后再继续父进程的其他任务。且此时可以在p.returncode中得到新进程的返回值。

def TestWait():

  import subprocess

  import datetime

  print (datetime.datetime.now())

  p=subprocess.Popen("sleep 10",shell=True)

  p.wait()

  print (p.returncode)

  print (datetime.datetime.now())

3) p.poll函数可以用来检测新创建的进程是否结束。

def TestPoll():

  import subprocess

  import datetime

  import time

  print (datetime.datetime.now())

  p=subprocess.Popen("sleep 10",shell=True)

  t = 1

  while(t <= 5):

    time.sleep(1)

    p.poll()

    print (p.returncode)

    t+=1

  print (datetime.datetime.now())

4) p.kill或p.terminate用来结束创建的新进程,在windows系统上相当于调用TerminateProcess(),在posix系统上相当于发送信号SIGTERM和SIGKILL。

def TestKillAndTerminate():

    p=subprocess.Popen("notepad.exe")

    t = 1

    while(t <= 5):

      time.sleep(1)

      t +=1

    p.kill()

    #p.terminate()

    print ("new process was killed")

5) p.communicate可以与新进程交互,但是必须要在popen构造时候将管道重定向。

def TestCommunicate():

  import subprocess

  cmd = "dir"

  p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

  (stdoutdata, stderrdata) = p.communicate()

  

  if p.returncode != 0:

        print (cmd + "error !")

  #defaultly the return stdoutdata is bytes, need convert to str and utf8

  for r in str(stdoutdata,encoding='utf8' ).split("\n"):

    print (r)

  print (p.returncode)


def TestCommunicate2():

  import subprocess

  cmd = "dir"

  #universal_newlines=True, it means by text way to open stdout and stderr

  p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

  curline = p.stdout.readline()
  while(curline != ""):

        print (curline)

        curline = p.stdout.readline()

  p.wait()

  print (p.returncode)

6) call函数可以认为是对popen和wait的分装,直接对call函数传入要执行的命令行,将命令行的退出code返回。

def TestCall():

  retcode = subprocess.call("c:\\test.bat")

  print (retcode)

7)subprocess.getoutput 和 subprocess.getstatusoutput ,基本上等价于subprocess.call函数,但是可以返回output,或者同时返回退出code和output。

但是可惜的是好像不能在windows平台使用,在windows上有如下错误:'{' is not recognized as an internal or external command, operable program or batch file.

def TestGetOutput():

  outp = subprocess.getoutput("ls -la")

  print (outp)
def TestGetStatusOutput():

  (status, outp) = subprocess.getstatusoutput('ls -la')

  print (status)

  print (outp)

8)总结

popen的参数,第一个为字符串(或者也可以为多个非命名的参数),表示你要执行的命令和命令的参数;后面的均为命名参数;shell=True,表示你前面的传入的命令将在shell下执行,如果你的命令是个可执行文件或bat,不需要指定此参数;stdout=subprocess.PIPE用来将新进程的输出重定向,stderr=subprocess.STDOUT将新进程的错误输出重定向到stdout,stdin=subprocess.PIPE用来将新进程的输入重定向;universal_newlines=True表示以text的方式打开stdout和stderr。

 其他的不推荐使用的模块:

os.system
os.spawn*
os.popen*
popen2.*
commands.*

Python 相关文章推荐
Python中的True,False条件判断实例分析
Jan 12 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python中的默认参数实例分析
Jan 29 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
python字符串下标与切片及使用方法
Feb 13 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 Python
python3实现Dijkstra算法最短路径的实现
May 12 Python
pandas求平均数和中位数的方法实例
Aug 04 Python
python神经网络 使用Keras构建RNN训练
May 04 Python
Python读取环境变量的方法和自定义类分享
Nov 22 #Python
Python中的引用和拷贝浅析
Nov 22 #Python
python实现的文件夹清理程序分享
Nov 22 #Python
Python判断操作系统类型代码分享
Nov 22 #Python
python logging类库使用例子
Nov 22 #Python
Python中模拟enum枚举类型的5种方法分享
Nov 22 #Python
Python读写Excel文件方法介绍
Nov 22 #Python
You might like
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
详解tensorflow载入数据的三种方式
2018/04/24 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
opencv实现简单人脸识别
2021/02/19 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
一套C#面试题
2013/10/09 面试题
机械制造毕业生求职信
2014/03/03 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
高一军训决心书
2015/02/05 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL