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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
Python中方法链的使用方法
Feb 23 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
pandas 层次化索引的实现方法
Jul 06 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
如何提高python 中for循环的效率
Apr 15 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
教你使用TensorFlow2识别验证码
Jun 11 Python
总结Python连接CS2000的详细步骤
Jun 23 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获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
讲解Python中的标识运算符
2015/05/14 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
汽车运用工程毕业生自荐信
2013/10/29 职场文书
技校生自我鉴定
2013/12/08 职场文书
志愿者服务感言
2014/02/27 职场文书
大学生求职信例文
2014/06/29 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
个人廉洁自律总结
2015/03/06 职场文书
英文慰问信范文
2015/03/24 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server