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使用7z解压apk包的方法
Apr 18 Python
python学习数据结构实例代码
May 11 Python
Python常用小技巧总结
Jun 01 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
Python 数据结构之旋转链表
Feb 25 Python
python实现list由于numpy array的转换
Apr 04 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
Django框架中表单的用法
Jun 10 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
ES2020 新特性(种草)
2020/01/12 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
Django Sitemap 站点地图的实现方法
2019/04/29 Python
Django实现文件上传下载
2019/10/06 Python
python turtle 绘制太极图的实例
2019/12/18 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
举例讲解Python装饰器
2020/12/24 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
Paul’s Boutique官网:英国时尚手袋品牌
2018/03/31 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
电工工作职责范本
2014/02/22 职场文书
2014年清明节寄语
2014/04/03 职场文书
群众路线个人整改方案
2014/10/25 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书