subprocess

主要功能室执行外部的命令和程序

一个进程可 fork 一个子进程, 并让这个子进程 exec 另外一个程序. 在 python 中, 可以通过标准库中的 subprocess 包来 fork 一个子进程, 并运行一个外部的程序.

subprocess

  • 创建子进程的函数, 这些函数分别用不同的方式创建进程.

    使用 subprocess 包中的函数创建子进程时, 要注意 :

    • 在创建子进程之后, 父进程是否暂停, 并等待子进程运行,
    • 函数返回什么
    • 当 returncode 不为 0 时, 父进程如何处理.
  • 管理标准流(standard stream)和管道(pipe)的工具, 从而在进程间使用文本通信.

subprocess.call(*popenargs, **kwargs)

父进程等待子进程完成, 返回退出信息(returncocde, 相当于 exit code)

subprocess.call("ls -l", shell=True)    # 返回值为 命令执行结果返回码
subprocess.call(["ls","-l"]) 

subprocess.check_call(*popenargs, **kwargs)

父进程等待子进程完成, 返回 0 ,
检查退出信息, 如果 returncode 不为 0, 则抛出 subprocess.CalledProcessError 错误. 

subprocess.check_call(['ls','-l'])      # 返回值为 命令执行结果返回码

subprocess.check_output(*popenargs, **kwargs)

父进程等待子进程完成, 返回子进程向标准输出的输出结果.
检查退出信息, 如果 returncode 不为 0, 则抛出错误 subprocess.CalledProcessError , 该对象包含有 returncode 属性和 output 属性, output 属性为标准输出的输出结果. 

subprocess.check_output(['ls','-l'])  # 返回值为 命令执行结果.

如果使用了shell=True这个参数。这个时候,我们使用一整个字符串,而不是一个表来运行子进程。Python将先运行一个shell,再用这个shell来解释这整个字符串。
shell命令中有一些是shell的内建命令,这些命令必须通过shell运行,$cd。shell=True允许我们运行这样一些命令。
当使用 shell 的内建命令时, 需要执行的命令及其参数必须为 一个整字符串, 并且加上 shell=True 参数.

subprocess.Popen()

上面三个函数(subprocess.call(), subprocess.check_all(), subprocess.check_output() )都是基于 Popen() 的封装. 该类生成的对象来代表子进程.

class 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)

args should be a string, or a sequence of program arguments.  The
program to execute is normally the first item in the args sequence or
string, but can be explicitly set by using the executable argument.

    On UNIX, with shell=False (default): In this case, the Popen class
    uses os.execvp() to execute the child program.  args should normally
    be a sequence.  A string will be treated as a sequence with the string
    as the only item (the program to execute).

    On UNIX, with shell=True: If args is a string, it specifies the
    command string to execute through the shell.  If args is a sequence,
    the first item specifies the command string, and any additional items
    will be treated as additional shell arguments.

    On Windows: the Popen class uses CreateProcess() to execute the child
    program, which operates on strings.  If args is a sequence, it will be
    converted to a string using the list2cmdline method.  Please note that
    not all MS Windows applications interpret the command line the same
    way: The list2cmdline is designed for applications using the same
    rules as the MS C runtime.

bufsize, if given, has the same meaning as the corresponding argument
to the built-in open() function: 0 means unbuffered, 1 means line
buffered, any other positive value means use a buffer of
(approximately) that size.  A negative bufsize means to use the system
default, which usually means fully buffered.  The default value for
bufsize is 0 (unbuffered).

stdin, stdout and stderr specify the executed programs' standard
input, standard output and standard error file handles, respectively.
Valid values are PIPE, an existing file descriptor (a positive
integer), an existing file object, and None.  PIPE indicates that a
new pipe to the child should be created.  With None, no redirection
will occur; the child's file handles will be inherited from the
parent.  Additionally, stderr can be STDOUT, which indicates that the
stderr data from the applications should be captured into the same
file handle as for stdout.

If preexec_fn is set to a callable object, this object will be called
in the child process just before the child is executed.

If close_fds is true, all file descriptors except 0, 1 and 2 will be
closed before the child process is executed.

if shell is true, the specified command will be executed through the
shell.

If cwd is not None, the current directory will be changed to cwd
before the child is executed.

If env is not None, it defines the environment variables for the new
process.

If universal_newlines is true, the file objects stdout and stderr are
opened as a text files, but lines may be terminated by any of '\n',
the Unix end-of-line convention, '\r', the Macintosh convention or
'\r\n', the Windows convention.  All of these external representations
are seen as '\n' by the Python program.  Note: This feature is only
available if Python is built with universal newline support (the
default).  Also, the newlines attribute of the file objects stdout,
stdin and stderr are not updated by the communicate() method.

The startupinfo and creationflags, if given, will be passed to the
underlying CreateProcess() function.  They can specify things such as
appearance of the main window and priority for the new process.
(Windows only)

Instances of the Popen class have the following methods:
    child.poll()   # 检查进程状态
        Check if child process has terminated. Returns returncode attribute.

    child.wati()
        wait for child process to terminate. Return returncode attribute.,\

    child.commuticate(input=None)  # 阻塞父进程, 直到子进程完成.
        Interact with process : Send data to stdin. Read data from stdout
                    and stderr, until end-of-file is reached. Wait for process ti terminate.
                    The optional input argument shout be a string to be sent to the child
                    process, or None, if no data should be sent to the child . 

        communicate() returns a tuple (stdout, stderr).

        Note: The data read is buffered in memory, so do not use this
        method if the data size is large or unlimited.

    child.kill()    # 终止进程

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

    child.terminate()   # 终止子进程.

attributes

    stdin
        If the stdin argument is PIPE, this attribute is a file object
        that provides input to the child process.  Otherwise, it is None.

    stdout
        If the stdout argument is PIPE, this attribute is a file object
        that provides output from the child process.  Otherwise, it is
        None.

    stderr
        If the stderr argument is PIPE, this attribute is file object that
        provides error output from the child process.  Otherwise, it is
        None.

    pid
        The process ID of the child process.

    returncode
        The child return code.  A None value indicates that the process
        hasn't terminated yet.  A negative value -N indicates that the
        child was terminated by signal N (UNIX only).

子进程的文本流控制 : subprocess.PIPE

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

子进程的标准输入, 标准输出, 标准错误:

child.stdin
child.stdout
child.stderr

我们可以在 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)

child.communicate() 是 Popen 对象的一个方法, 该方法阻塞父进程, 直到子进程完成.

使用 communicate() 方法来使用 PIPE 给子进程输入 :
import subprocess
child = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
child.communicate("hahahah")   # 我们启动子进程之后, cat 会等待输入, 知道 communicate() 输入 "hahahah"

参考

python 标准库 -- subprocess的更多相关文章

  1. python 标准库subprocess

    作者:Vamei 出处:http://www.cnblogs.com/vamei subprocess包主要功能是执行外部的命令和程序.subprocess的功能与shell类似.subprocess ...

  2. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  3. Python标准库——走马观花

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...

  4. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  5. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  6. Python 标准库一览(Python进阶学习)

    转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...

  7. python 标准库大全

    python 标准库 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 string ...

  8. Python - 标准库概况 - 第二十一天

    Python 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. 建议使用 "import os" 风格而非 "from os import *&quo ...

  9. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

随机推荐

  1. 今天打补丁出问题了,害得我组长被扣了1k奖金。

    今天是第三次给mxdw打补丁和打包,外加公司高管说有一个东西必须要今天之内搞定外放. 我当时问策划为什么这么着急?策划说大佬决定的(这种做事方式真的很不习惯).我等屁民加班加点的搞事情,把功能搞出去了 ...

  2. Ajax与Pjax请求在服务端是如何识别的

    我在后台处理ajax和一般的网页请求时,一般是需要额外加个参数进行区分的.比如使用get参数的is_ajax=1,后台判断有is_ajax=1成立时,表明该请求是ajax请求,遂可区分处理.我正在使用 ...

  3. 解析Excel文件并把数据存入数据库

    前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致 ...

  4. Python变量运算字符串等

    一,作用域 操作 name = 'liuyueming' if 1==1:... print name... liuyueming 两次回车执行 修改代码 >>> if 1==1:. ...

  5. Thinkphp3.2学习——架构_URL模式

    入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块.控制器和操作: http://serverName/index.php/模块/控制器/操作 这是 ...

  6. Linux使用Jexus托管Asp.Net Core应用程序

    第一步 安装.Net Core环境 安装 dotnet 环境参见官方网站 https://www.microsoft.com/net/core. 选择对应的系统版本进行安装.安装完成过后 输入命令查看 ...

  7. Linux:PS命令详解与使用

    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占 ...

  8. 配置网络yum源

    有的时候服务器需要下载一些软件,是本地yum源没有的,这时候需要配置网络yum源 #cd  /etc/yum.repos.d/ 把这个目录下的配置文件备份,改名:或者是把文件里边的enabled=1的 ...

  9. Windows8.1 + Nvidia cuda8.0 + Vs2015

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Vs2015 1.查看本机配置,查看显卡类型是否支持NVIDIA GPU选中计算机-->右键属性-->设备管理 ...

  10. JSON的使用小结

    JSON中存储的是key:value,其实在编程的时候我们会遇到很多都是key:value的形式.比如:map,java对象(一个对象的一个属性只会有一个值),数据库中key:value对应着里面存储 ...