Python标准模块——subprocess

来源:互联网 发布:f22到底有多先进知乎 编辑:程序博客网 时间:2024/06/09 13:03

6、 subprocess

python通过subprocess模块执行shell命令,替代了多个旧模块:os.system, os.spawn*, os.popen*, popen2.*, commands.* 。
import subprocess
class 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)
创建新进程,在新进程中执行子程序。
     参数:

  • args:程序参数序列或者一个字符串。如果是序列的话,可以使用shlex.split()函数得到。
  • stdin、stdout、stderr是可执行程序的标准输入、标准输出和标准错误文件句柄。可以是PIPE、已存在文件的描述符或者已存在文件对象。如果是PIPE,表明需要创建新的pipe。
  • cwd不是None时,孩子的当前目录在执行之前会变成cwd。

属性

Popen.returncode
子进程返回值,通过poll()和wait()进行设置。None值表示进程没有终止;负值-N表示子进程是由信号量N终止的。

方法

Popen.wait()
等待子进程终止。设置并返回returncode的属性。wait是有可能发生死锁的,比如如果stdout或者stderr是PIPE,并且子进程输出到PIPE的数据非常大时会导致该进程阻塞,等待OS的pipe缓冲区可以接受更多的数据。

举例

   # Form the MATLAB script command that processes images and write to   # temporary results file.   f, output_filename = tempfile.mkstemp(suffix='.mat')   os.close(f)   #output_filename = 'output.mat'   fnames_cell = '{' + ','.join("'{}'".format(x) for x in image_fnames) + '}'   command = "{}({}, '{}')".format(cmd, fnames_cell, output_filename)   #print(command)   # Execute command in MATLAB.   mc = "sudo /usr/local/MATLAB/R2015b/bin/matlab -nojvm -r \"try; {}; catch; exit; end; exit\"".format(command)   pid = subprocess.Popen(shlex.split(mc), stdout=open('/dev/null', 'w'), cwd=script_dirname)   retcode = pid.wait()   print 'returncode',retcode   if retcode != 0:       raise Exception("Matlab script did not exit successfully!")
0 0