Skip to main content

subprocess

模块介绍

subprocess模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。

subprocess模块打算来替代几个过时的模块和函数,比如: os.system, os.spawn*, os.popen*, popen2.*命令。 让我们来看一下subprocess 有哪些不同的函数.

https://blog.csdn.net/qq_34765864/article/details/91517246

主要函数

call()

  • 父进程等待子进程完成 (阻塞

  • 语法:

    subprocess.call(
    commands:list|str,
    shell:bool
    ) -> returncode # 相当于Linux exit code

返回退出信息(returncode,相当于Linux exit code)

check_call()

  • 父进程等待子进程完成 (阻塞
  • 语法:同call()
  • 返回:0

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查

check_output()

  • 父进程等待子进程完成 (阻塞
  • 语法:同call()
  • 返回:返回子进程向标准输出的输出结果

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查。

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
    )

实际上,上面的几个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。

与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block),举例:

import subprocess
child = subprocess.Popen(['ping','-c','4','blog.linuxeye.com'])
print 'parent process'

Popen() 实例下有几个声明周期api,分别是:

声明周期

child = subprocess.Popen('ping -c4 blog.linuxeye.com', shell=True)

child.wait() # 阻塞运行,父进程在开启子进程之后并等待child的完成
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
child.pid # 存储子进程 PID

文本流控制

child.stdin()             # 
child.stdout() #
child.stderr() #

child1.communicate() #

Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe)

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

#或者child1.communicate()
import subprocess
child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
out = child2.communicate()

基础使用

import subprocess

subprocess.call

subprocess.call(["node", '-v'], shell=True)