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信息。

关于subprocess的安全性:

不像其他的popen函数,不会直接调用/bin/sh来解释命令,也就是说,命令中的每一个字符都会被安全地传递到子进程里。

一:用subprocess获取stdout和stderr

第一种方案:

import subprocess

p = subprocess.Popen(['tail','-10','/tmp/hosts.txt'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)

stdout,stderr = p.communicate()

print 'stdout : ',stdout

print 'stderr : ',stder

popen调用的时候会在父进程和子进程建立管道,然后我们可以把子进程的标准输出和错误输出都重定向到管道,然后从父进程取出。上面的communicate会一直阻塞,直到子进程跑完。这种方式是不能及时获取子程序的stdout和stderr。

第二种方案:

可以获取实时的输出信息

p = subprocess.Popen("/etc/service/tops-cmos/module/hadoop/test.sh", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

returncode = p.poll()

while returncode is None:

    line = p.stdout.readline()
    returncode = p.poll()
    line = line.strip()
    print line

print returncode

这里就是把错误输出重定向到PIPE对应的标准输出,也就是说现在stderr都stdout是一起的了,下面是一个while,poll回去不断查看子进程是否已经被终止,如果程序没有终止,就一直返回None,但是子进程终止了就返货状态码,甚至于调用多次poll都会返回状态码。上面的demo就是可以获取子进程的标准输出和标准错误输出。

二:使用subprocess的Popen函数执行系统命令

1、执行shell命令:

Popen函数指定shell=True即可,linux下参数executable将指定程序使用的shell,windows下无须指定。

在windows下执行cd命令获取当前目录

p2 = Popen('cd',shell=True)

2、执行其他程序

3、指定子进程工作路径:

使新建的子进程工作指定的工作目录之下:

import sys,os,subprocess,commands

from subprocess import Popen,PIPE

p2 = Popen('cd',shell=True,stdout=PIPE,cwd='E:\svnworking')

p2.wait()

print "当前目录:%s" %p2.stdout.read()

上述命令使用了cwd,该参数指定了子进程工作目录。这个参数很有用,有时涉及到相对路径的时候必须如果不指定cwd,则程序可能出错。

a.py文件:

p2 = Popen('python c:\b.py',shell=True,stdout=PIPE) #在a.py运行脚本b.py

p2.wait()

print "当前目录:%s" %p2.stdout.read()

b.py文件:

f=open('test.txt','a') #注意这里使用了相对路径

f.close()

当a.py和b.py不在同一个目录的时候,运行a.py肯定报错(找不到指定的文件test.txt)。

原因:因为p2 = Popen('python c:\b.py',shell=True,stdout=PIPE') 创建的子进程与a.py在同一目录下工作,而该目录没有test.py。

解决方法:指定cwd参数。

4、获取Popen的返回值及输出

# -*- coding: UTF-8 -*-

#执行另外一个脚本

import sys,os,subprocess,commands

from subprocess import Popen,PIPE

p = Popen('python ' + path + '\getCurPath.py', stdout=PIPE, stderr=PIPE)

p.wait()

if(p.returncode == 0):

print "stdout:%s" %p.stdout.read()

三:subprocess的Popen函数的等待(wait()方法)

1. Popen对象创建后,主程序不会自动等待子进程完成。

我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block):

    import subprocess

    child = subprocess.Popen(["ping","-c","5","www.google.com"])

    print("parent process")

从运行结果中看到,父进程在开启子进程之后并没有等待child的完成,而是直接运行print。

2. 对比等待的情况:

   import subprocess

   child = subprocess.Popen(["ping","-c","5","www.google.com"])

   child.wait()

   print("parent process")

此外,你还可以在父进程中对子进程进行其它操作,比如我们上面例子中的child对象:

child.poll()           # 检查子进程状态

child.kill()           # 终止子进程

child.send_signal()    # 向子进程发送信号

child.terminate()      # 终止子进程

子进程的PID存储在child.pid

四:subprocess的Popen函数的标准输入、标准输出和标准错误

1. 可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,

并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):

    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)

subprocess.PIPE实际上为文本流提供一个缓存区。

child1的stdout将文本输出到缓存区,随后child2的stdin从该PIPE中将文本读取走。

child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。

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

2. 还可以利用communicate()方法来使用PIPE给子进程输入:

    import subprocess

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

    child.communicate("vamei")

我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。

通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。

如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),

并将应用的结果输出给Python,并让Python继续处理。

shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。

Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。