subprocess模块

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


 

Popen类

  subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。

Popen类的构造函数如上图,其主要参数为:

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

  stdin,stdout,stderr:分别表示程序的标准输入、标准输出、标准错误。有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。

  shell:如果这个参数被设置为True,程序将通过shell来执行。

  env:它描述的是子进程的环境变量。如果为None,子进程的环境变量将从父进程继承而来。

  cwd:用于设置子进程的当前目录。

  universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

 

 可直接构造Popen类的实例化对象:

  r = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    cmd:shell命令

    subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。

 

Popen类拥有的方法及属性:

  1. r.pid  # 返回子进程的进程ID。
  2. r.returncode  # 返回进程的返回码。如果进程未结束,将返回None。
  3. r.communicate(input=None)  # 与子进程进行交互,向stdin发送数据,并从stdout和stderr中读出数据存储在一个tuple中并返回。
    参数input应该是一个发送给子进程的字符串,如果未指定数据,将传入None。
  4. r.poll()   # 检查子进程是否结束,并返回returncode属性。
  5. r.wait()  # 等待子进程执行结束,并返回returncode属性,如果为0表示执行成功。
  6. r.send_signal( sig)  # 发送信号给子进程。
  7. r.terminate()  # 终止子进程。
  8. r.kill()  # 杀死子进程。
  9. r.stdin,r.stdout和r.stderr  # 分别表示标准输入、输出和错误,标准输入有write()方法,标准输出和错误有read()方法,都有close()方法。

 

subprocess模块中一些封装了Popen类的函数

  1. subprocess.run()  # 执行命令

  2. subprocess.call()  # 执行命令,返回命令的结果和执行状态,0或者非0

  3. subprocess.check_call()  # 执行命令,返回结果和状态,正常为0 ,执行错误则抛出异常

  4. subprocess.getstatusoutput()  # 接受字符串形式的命令,返回 一个二元组,第一个元素是命令执行状态,第二个为执行结果

  5. subprocess.getoutput()  # 接受字符串形式的命令,放回执行结果

  6. subprocess.check_output()  # 执行命令,返回执行的结果,而不是打印

 

 

 

posted @ 2019-11-20 19:21  eat&  阅读(138)  评论(0编辑  收藏  举报