Python的subprocess模块总结


Posted in Python onNovember 07, 2014

subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.*
subprocess最简单的用法就是调用shell命令了,另外也可以调用程序,并且可以通过stdout,stdin和stderr进行交互。

subprocess的主类

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)

1)、args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。

2)、bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲(全缓冲)

3)、stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。

4)、preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。

5)、Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。我们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。

6)、shell设为true,程序将通过shell来执行。

7)、cwd用于设置子进程的当前目录

8)、env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用'/r/n'表示换,而Linux下用'/n'。如果将此参数设置为True,Python统一把这些换行符当作'/n'来处理。startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

9)、startupinfo与createionflags只在windows下有效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

Popen方法

1)、Popen.poll():用于检查子进程是否已经结束。设置并返回returncode属性。

2)、Popen.wait():等待子进程结束。设置并返回returncode属性。

3)、Popen.communicate(input=None):与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

4)、Popen.send_signal(signal):向子进程发送信号。

5)、Popen.terminate():停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

6)、Popen.kill():杀死子进程。

7)、Popen.stdin:如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

8)、Popen.stdout:如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。

9)、Popen.stderr:如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。

10)、Popen.pid:获取子进程的进程ID。

11)、Popen.returncode:获取进程的返回值。如果进程还没有结束,返回None。

12)、subprocess.call(*popenargs, **kwargs):运行命令。该函数将一直等待到子进程运行结束,并返回进程的returncode。文章一开始的例子就演示了call函数。如果子进程不需要进行交互,就可以使用该函数来创建。

13)、subprocess.check_call(*popenargs, **kwargs):与subprocess.call(*popenargs, **kwargs)功能一样,只是如果子进程返回的returncode不为0的话,将触发CalledProcessError异常。在异常对象中,包括进程的returncode信息。

以上全是抄的

在程序中运行其他程序或shell

可以这样写

subprocess.Popen('脚本/shell', shell=True)

也可以这样

subprocess.call('脚本/shell', shell=True)

两者的区别是前者无阻塞,会和主程序并行运行,后者必须等待命令执行完毕,如果想要前者编程阻塞可以这样
s = subprocess.Popen('脚本/shell', shell=True)

s.wait()

程序返回运行结果

有时候我们需要程序的返回结果,可以这样做。

>>> s = subprocess.Popen('ls -l', shell=True, stdout=subprocess.PIPE) 

>>> s.communicate() 

('\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 152\n-rw------- 1 limbo limbo   808  7\xe6\x9c\x88  6 17:46 0000-00-00-welcome-to-jekyll.markdown.erb\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88 15 18:43 arg\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88  7 17:37 argv\ndrwxrwxr-x 2 limbo limbo  4096  9\xe6\x9c\x88 10 15:27 c\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9c\x88 11 14:35 d3\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9n', None)

它会返回一个元组:(stdoutdata, stderrdata)

subprocess还有另一种更简单方法,效果一样,它会返回stdout

>>> s = subprocess.check_output('ls -l', shell=True)

>>> s

'\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 152\n-rw------- 1 limbo limbo   808  7\xe6\x9c\x88  6 17:46 0000-00-00-welcome-to-jekyll.markdown.erb\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88 15 18:43 arg\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88  7 17:37 argv\ndrwxrwxr-x 2 limbo limbo  4096  9\xe6\x9c\x88 10 15:27 c\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9c\x88 11 14:35 d3\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9n'

前者可以实现更多的交互,如stderr和stdin,但是在前面调用Popen的时候要实现定义Popen(stdin=subprocess.PIPE, stderr=subprocess)

给子进程输入

import subprocess

child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)

child.communicate("vamei")

()不为空,则写入subprocess.PIPE,为空,则从subprocess.PIPE读取

subprocess.PIPE

#!/usr/bin/env python

import subprocess

child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)

child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)

out = child2.communicate()

print out

实际上是这样的过程

child1.stdout-->subprocess.PIPE
child2.stdin<--subprocess.PIPE
child2.stdout-->subprocess.PIPE

要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。

subprocess.PIPE实际上为文本流提供一个缓存区。直到communicate()方法从PIPE中读取出PIPE中的文本.要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。

Python 相关文章推荐
python中cPickle用法例子分享
Jan 03 Python
介绍Python中的__future__模块
Apr 27 Python
Python中返回字典键的值的values()方法使用
May 22 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
python如何实现int函数的方法示例
Feb 19 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
python将回车作为输入内容的实例
Jun 23 Python
Python语言快速上手学习方法
Dec 14 Python
python SVM 线性分类模型的实现
Jul 19 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 #Python
Python实现的简单发送邮件脚本分享
Nov 07 #Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 #Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 #Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 #Python
零基础写python爬虫之爬虫编写全记录
Nov 06 #Python
零基础写python爬虫之打包生成exe文件
Nov 06 #Python
You might like
Docker配置PHP开发环境教程
2016/12/21 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
JavaScript 学习初步 入门教程
2010/03/25 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
python中的闭包用法实例详解
2015/05/05 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
详解Python自建logging模块
2018/01/29 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python logging添加filter教程
2019/12/24 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Python如何定义有可选参数的元类
2020/07/31 Python
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
生产主管岗位职责
2013/11/10 职场文书
老同学聚会感言
2014/02/23 职场文书
南京青奥会口号
2014/06/12 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
加入学生会自荐书
2015/03/05 职场文书