文档章节

python subprocess模块

Bing-
 Bing-
发布于 2016/05/13 09:23
字数 1160
阅读 12
收藏 0
点赞 2
评论 0

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)

 

 

这个模块主要包含一个Popen类

 

args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。在windows操作系统上,Popen通过调用CreateProcess()来创建子进程,CreateProcess接收一个字符串参数,如果args是序列类型,系统将会通过list2cmdline()函数将序列类型转换为字符串。


executable用于指定可执行程序。一般情况下我们通过args参数来设置所要运行的程序。如果将参数shell设为True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。


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


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


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


shell=true,程序将通过shell来执行。
cwd用于设置子进程的当前目录。


env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。


Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用'\r\n'表示换,而Linux下用'\n'。如果将此参数设置为True,Python统一把这些换行符当作'\n'来处理。


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

 

subprocess.PIPE

  在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。

 

subprocess.STDOUT

  创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。

 

Popen的方法:

Popen.poll()

  用于检查子进程是否已经结束。设置并返回returncode属性。

 

Popen.wait()

  等待子进程结束。设置并返回returncode属性。

 

Popen.communicate(input=None)

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

 

Popen.send_signal(signal)

  向子进程发送信号。

 

Popen.terminate()

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

 

Popen.kill()

  杀死子进程。

 

Popen.stdin

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

 

Popen.stdout

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

 

Popen.stderr

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

 

Popen.pid

  获取子进程的进程ID。

 

Popen.returncode

  获取进程的返回值。如果进程还没有结束,返回None。

下面是一个非常简单的例子,来演示supprocess模块如何与一个控件台应用程序进行交互。

 

You can kill the pragram,When the pragram is timeout...

for example:

#!/usr/bin/env python
#coding:utf-8
#author:Bing
import subprocess
import select,time,datetime
from config import cur_file_dir    

    run_script_path = cur_file_dir()+"/poc/"
    
    def poc_verify(self,target, poc_file,taskid = None):
        #run_env = '{"LD_LIBRARY_PATH": "/home/thorns/libs/"}'    
        if taskid == None:
            cmdline = 'python %s %s' % (poc_file,target)
        else:
            cmdline = 'python %s %s %s' % (poc_file,target, taskid)
        start = datetime.datetime.now()
        proc = subprocess.Popen(cmdline,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd=self.run_script_path)
        #,env=run_env
        while proc.poll() is None:
            time.sleep(0.1)
            now = datetime.datetime.now()
            if (now - start).seconds > 10:
                try:
                    proc.kill()
                    print "Time is out! Process:%s;Target:%s"% (proc.pid,target)
                    return
                except Exception,e:
                    return None
                return None
        result = proc.communicate()[0]#proc.stdout.readlines()
        if proc.stdin:
            proc.stdin.close()
        if proc.stdout:
            proc.stdout.close()
        if proc.stderr:
            proc.stderr.close()
        if result:
            proc.kill()
            print result
        else:
            proc.kill()
        

 

© 著作权归作者所有

共有 人打赏支持
Bing-
粉丝 0
博文 25
码字总数 18863
作品 0
大连
python调用shell命令

python调用shell命令 1.1 os.system(command) 在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command...

狷狂
2014/08/11
0
0
Python标准库06 子进程 (subprocess包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 谢谢Tolbkni Kao帮我纠正错误 这里的内容以Linux进程基础和Linux文本流为基础。subprocess包主要功能是...

张旭0512
2014/05/27
0
0
Python subprocess模块学习总结

从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system、os.spawn*、os.popen*、popen2.*、commands.*不但可以调用外部的命令作为子进程,而且可以...

mysoftsky
2014/03/13
0
0
Python执行系统命令的方法

Python中执行系统命令常见方法有两种: 两者均需 import os (1) os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) -> exit_status Execute the c...

mickelfeng
2013/06/09
0
0
Python调用Ant构建时根据构建状态来决定命令行退出状态

在使用python执行Ant构建时遇到的问题: 使用os.system()调用Ant构建时,不论构建成功还是失败(BUILD SUCCESSFUL/BUILD FAILED),命令行的总是正常退出 要解决问题: 首先想到的是获取ant...

donhui
2015/04/16
0
0
(总结)python 3程序开发指南(五)模块

1.有些情况下,使用单独的一条语句导入包中的所有模块会带来方便,为此在init.py文件中加入all=["",""]包含模块的名字。同理要想对导入模块中所有函数叶可以添加__all__选项,精确控制导入的...

索隆
2012/04/24
0
0
Streaming执行Python版WordCount

一:先写map类 import sysfor line in sys.stdin:line = line.strip( )words = line.split( )for word in words:print('%st%s' % (word, 1)) 二:写reduce类 import syscurrent_word = Nonec......

白话
06/26
0
0
python--多进程的用法详解实例

想让python实现多进程(multiprocessing),我们要先区分不同的操作系统的不同之处。 Linux操作系统下提供了一个fork()系统调用,普通函数调用一次返回一次,fork()调用一次返回两次,因为操作...

山有木兮有木兮
05/14
0
0
ubuntu16.04卸载自带python 后出现问题

如题,问题如下: ubuntu命令行安装软件时,出现如下错误: Preparing to unpack .../python3-software-properties0.96.20.7all.deb ... import: unable to grab mouse `': Resource tempor......

drivesoul
04/18
0
0
Python 学习总结(三):巧用各类模块,方便维护

这节的内容主要讲下模块的使用,很好很强大,有木有。在开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分...

海岸线的曙光
01/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 配置时间和日期格式

你可以修改你 Confluence 为用户显示的时期和时间格式。设置的句法使用的是 SimpleDateFormat class,请参考 Java SimpleDateFormat 文档中的内容来设置日期和时间格式。 有下面 3 个时间和日...

honeymose
3分钟前
0
0
php seralize unserialize

关于PHP 序列化(serialize)和反序列化(unserialize)出现错误(Error at offset)的解决办法。 首先我们分析一下为什么会出现这个错误: 编码问题 UTF-8: ANSI: 我发现在我的机器上边编码改...

yeahlife
10分钟前
0
0
七、JSP九大内置对象和四个作用域

九大内置对象: request:类型是HttpServletRequest,和Servlet里的HttpServletRequest一模一样。 response:类型是HttpServletResponse,和Servlet里的HttpServletResponse一模一样。JSP里基...

Wakeeee_
13分钟前
0
0
第十四章NFS服务搭建与配置

14.1 NFS介绍 NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netap...

Linux学习笔记
45分钟前
0
0
双向认证-nginx

1、设置容器 docker run -it --name nginx-test2 -v /home/nginx:/apps -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8183:80 -p 7443:443 -d nginx:stable 2、修改nginx配......

hotsmile
45分钟前
0
0
深入了解 Java 自动内存管理机制及性能优化

一图带你看完本文 一、运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造。根据《Java虚拟机规范(Java SE 7 版)》的规...

Java大蜗牛
47分钟前
4
0
SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等。这章节开始,开始总结一些关于springboot的综合开发的知识点。由于SpringBoot本身是基于Spring和SpringMvc...

oKong
48分钟前
9
0
云数据库架构演进与实践

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。 微服务,也就是一种面向服务的,有特定边界的松...

巨杉数据库
49分钟前
0
0
Linux系统梳理---系统搭建(一):jdk卸载与安装

1.去官网下载符合Linux版本的jdk,暂用jdk-8u171-linux-x64.rpm 2.登陆Linux,进入usr目录,创建java目录(方便管理,可以其他位置):mkdir java 3.上传下载的jdk包至Linux服务器,使用rz指令(sz f...

勤奋的蚂蚁
今天
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

六库科技
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部