python中的subprocess.Popen()使用详解

  

从python2.4版本开始,可以用子流程这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值。

  

子流程意在替代其他几个老的模块或者函数,比如:操作系统。系统操作系统。产卵*操作系统。popen * popen2。*命令。*

  

<强>一、subprocess.Popen

  

子流程模块定义了一个类:Popen

        类子流程。Popen (args,   bufsize=0,   可执行=没有   stdin=没有   stdout=没有   stderr=没有   preexec_fn=没有   close_fds=False,   shell=False,   慢性消耗?没有   env=没有   universal_newlines=False,   startupinfo=没有   creationflags=0)      

各参数含义如下:

  

参数:   

args参数。可以是一个字符串,可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。

        subprocess.Popen([“猫”,“用法”])   子流程。Popen(猫用法)      

这两个之中,后者将不会工作,因为如果是一个字符串的话,必须是程序的路径才可以。(考虑unix的api函数执行,接受的是字符串列表)但是下面的可以工作

        子流程。Popen(“猫测试。txt”, shell=True)      

这是因为它相当于

        子流程。Popen ((“/bin/sh”、“c”,“猫用法”)      

在* nix下,当shell=False(默认)时,Popen使用os.execvp()来执行子程序.args一般要是一个【列表】。如果args是个字符串的话,会被当做是可执行文件的路径,这样就不能传入任何参数了。

  

注意:   

shlex.split()可以被用于序列化复杂的命令参数,比如:

        在在在shlex。split (ls ps grep pkill顶部)   (“ls”、“ps”、“顶”,“grep”,“pkill”)   在祝辞祝辞进口shlex,子流程   在祝辞祝辞command_line=raw_input ()/bin/cat固化试验。txt diege与产出”。txt - cmd“echo $钱”   在祝辞祝辞args=shlex.split (command_line)   在在在打印参数   (“/bin/猫”,“固化”的测试。txt”、“与产出”、“diege。txt”、“奴隶拴住”、“echo $钱”)   在祝辞祝辞;p=subprocess.Popen (args)      

可以看的到,空格分隔的选项固化(如)和参数(如用法)会被分割为列表里独立的项,但引号里的或者转义过的空格不在此列。这也有点像大多数壳的行为。

  

在linux下,当shell=True时,如果arg是个字符串,就使用贝壳来解释执行这个字符串。如果args是个列表,则第一项被视为命,令其余的都视为是给壳牌本身的参数。也就是说,等效于:

        子流程。Popen (['/bin/sh ', ' c ', arg游戏[0],arg游戏[1],…])      

在Windows下、下面的却又是可以工作的

        subprocess.Popen”([记事本。exe”、“用法”)   subprocess.Popen(“记事本。exe用法”)      

这是由于windows下的api函数CreateProcess接受的是一个字符串。即使是列表形式的参数,也需要先合并成字符串再传递给api函数

        subprocess.Popen(“记事本。exe测试。txt”shell=True)      

等同于         subprocess.Popen (“cmd。exe/C“+”记事本。exe测试。txt”shell=True)      

bufsize参数:

  

如果指定了bufsize参数作用就和内建函数()开放一样:0表示不缓冲,1表示行缓冲,其他正数表示近似的缓冲区字节数,负数表示使用系统默认值。默认是0。

  

执行参数:

  

指定要执行的程序。它很少会被用到:一般程序可以由args参数指定。如果壳=True,可执行可以用于指定用哪个壳来执行(比如bash、csh、zsh等)。* nix下,默认是/bin/sh, windows下,就是环境变量全路径名的值.windows下,只有当你要执行的命令确实是壳内建命令(比如dir,复制等)时,你才需要指定shell=True,而当你要执行一个基于命令行的批处理脚本的时候,不需要指定此项。

  

stdin stdout和stderr:

  

stdin stdout和stderr,分别表示子程序的标准输入,标准输出和标准错误。可选的值有管或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有没有。如果是管道,则表示需要创建一个新的管道,如果是没有,不会做任何重定向工作,子进程的文件描述符会继承父进程的。另外,stderr的值还可以是stdout,表示子进程的标准错误也输出到标准输出。

python中的subprocess.Popen()使用详解