今天在写一个自动刷机的脚本,需要用到这个模块,就仔细看了一下。
本文是Python3的subprocess模块的学习笔记。
subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的stdin/stdout/stderr,获取
子进程的返回值等操作。该模块的出现起初是为了代替下面几个老模块中的某些功能:
os.system
os.spawn*
subprocess对应于PEP324。
* Popen
该模块定义的最为核心的类是Popen。
Popen的初始化参数包括(args, bufsize, executable, stdin, stdout, stderr, preexec_fn,
close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags),除了args之外,其它
参数均有默认值(0,None,或者False):
1. args:一个字符串,或者一个序列的字符串。对于一个字符串而言,默认情况下,这就是在子进程中
要执行的程序,对于序列而言,第一个字符串时要执行的程序,后续的字符串是给程序的参数。
2. executable=None:如果该参数被设置,它是真正要执行的程序,但是,args中的第一个字符串仍然
会作为argv[0]传递给程序,从而变成该程序的显示名。
3. shell=False:False时,如果args只是一个字符串,则被当作要执行的程序的路径名,其中不能有命令
行参数;True时,如果args是一个字符串,它作为shell的命令行进行执行。注意:这个区别只限于
Unix系统,对于Windows系统,两者基本是相同的。
4. bufsize=0:读写缓冲区大小,0表示不用buffer,1表示行buffer,负数表示采用系统默认值,其它正数
表示一个buffer的近似大小(字节单位);
5. stdin/stdout/stderr=None:用于建立管道连接到子进程的相应流:
a. None:不做任何重定向,子进程的文件句柄继承自父进程;
b. subprocess.PIPE:创建一个新的管道,连接相应的流;
c. 文件对象:重定向到指定的文件对象;
d. 另外,stderr可以被设置为subprocess.STDOUT,表示stderr流被重定向到stdout,在stdout处同时
被重定向。
6. preexec_fn=None:如果设置(仅对Unix系统有效),该方法会在子进程中执行指定程序之前被调用。
7. close_fds=False:如果为True,除了0,1,2以外的其他文件描述符都会在子进程中被关闭(对于Unix);
对于Windows,子进程不会继承任何父进程的句柄,并且,
子进程的stdin/stdout/stderr也不能被重定向。
Popen对象的常用方法/属性包括:
1. poll():检查子进程是否已经终止,如果是,设置并返回returncode属性;
2. wait():等待子进程终止,设置并返回returncode;注意:这个方法可能导致死锁:如果子进程对
stdout/stderr使用的管道产生大量输入,可能填满管道的buffer,这样,子进程就会等待其它人读取
这些buffer。
3. communicate(input=None):将数据发给子进程的stdin,并从子进程的stdout/stderr读取数据,直到
eof。等待子进程结束,返回(stdoutdata, stderrdata),注意:读取的数据是存放在内存中的。
如果想用这个函数发送数据或者读取数据,创建Popen时需要制定stdin/stdout/stderr为管道。
4. send_signal(signal):向子进程发送指定的信号;
5. terminate():终止子进程,在Unix上,就是向子进程发送SIGTERM。
6. kill():杀死子进程,在Unix上,就是向子进程发送SIGKILL。
7. stdin/stdout/stderr:如果相应的参数是PIPE,则这个属性引用创建的PIPE文件对象。
8. pid:子进程的id;
9. returncode:子进程的返回值,被poll()和wait()设置(communicate()也会设置)。如果返回值是-N,
表示子进程是被Unix的信号N杀死的。
* 异常处理
在子进程中,如果在加载并执行指定的程序之前,抛出了异常,这个异常会在父进程中被重新抛出。例如,
常见的一个异常是OSError(没有找到要执行的程序)。这种异常会多一个字段:child_traceback,该字段包含了
从子进程观点来看的traceback信息。
如果Popen的参数类型不对,Popen也会抛出ValueError异常。
* 工具函数
这个模块定义了几个工具函数,可以比较方便的完成一些简单功能。
1. call(*popenargs, **kwargs):创建新进程执行popenargs中定义的程序(及参数),等待子进程执行
结束,并返回子进程的返回码。
2. check_call(*popenargs, **kwargs):与call()方法类似,但是,如果子进程的返回值不是0,它会
抛出CalledProcessError异常,如果是0,正常返回。
3. check_output(*popenargs, **kwargs):与call()方法类似,以byte string的方式返回子进程的输出,
如果子进程的返回值不是0,它抛出CalledProcessError异常,这个异常中的returncode包含返回码,
output属性包含已有的输出。
4. getstatusoutput(cmd)/getoutput(cmd):这两个函数仅仅在Unix下可用,它们在shell中执行指定的
命令cmd,前者返回(status, output),后者返回output。其中,这里的output包括子进程的stdout和
stderr。
阅读(3454) | 评论(0) | 转发(0) |