标签:取数据 size output 模块 其他 工作 div error 可调用对象
import subprocess p = 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) out, err = p.communicate()
对于 stdin, stdout 和 stderr 而言,如果他们是 None(默认情况),那么子进程使用和父进程相同的标准流文件。 stdin, stdout 和 stderr 也可以是已经打开的 file 对象,前提是以合理的方式打开,比如 stdin 对应的文件必须要可读等。
父进程如果想要和子进程通过 communicate() 方法通信,对应的参数必须是 subprocess.PIPE(见下文例4);
同 Linux 中创建子进程类似,父进程创建完子进程后,并不会自动等待子进程执行,父进程在子进程之前推出将导致子进程成为孤儿进程,孤儿进程统一由 init 进程接管,负责其终止后的回收工作。
如果父进程在子进程之后终止,但子进程终止时父进程没有进行最后的回收工作,子进程残留的数据结构称为僵尸进程。大量僵尸进程将耗费系统资源,因此父进程及时等待和回收子进程是必要的,除非能够确认自己比子进程先终止,从而将回收工作过渡给 init 进程。这个等待和回收子进程的操作就是wait()函数.
1. p.poll() 检查子进程 p 是否已经终止,返回 p.returncode 属性【=0正常退出;<0被信号杀掉了; >0异常退出,returncode对应于出错码; None子进程尚未结束】;
2. p.wait() 等待子进程 p 终止,返回 p.returncode 属性; 注意:wait() 立即阻塞父进程,直到子进程结束!
3. out, err = p.communicate(input=None) 和子进程 p 交流,将参数 input (字符串)中的数据发送到子进程的 stdin,同时从子进程的 stdout 和 stderr 读取数据,直到EOF。
返回值: 二元组 (stdoutdata, stderrdata) 分别表示从标准出和标准错误中读出的数据。
父进程调用 p.communicate() 和子进程通信有以下限制:
(1) 只能通过管道和子进程通信,也就是说,只有调用 Popen() 创建子进程时参数 stdin=subprocess.PIPE,才能通过 p.communicate(input) 向子进程的 stdin 发送数据;只有参数 stout 和 stderr 也都为 subprocess.PIPE ,才能通过p.communicate() 从子进程接收数据,否则接收到的二元组中,对应的位置是None。
(2)父进程从子进程读到的数据缓存在内存中,因此commucate()不适合与子进程交换过大的数据。
注意:communicate() 立即阻塞父进程,直到子进程结束!
4. p.send_signal(signal) 向子进程发送信号 signal;
5. p.terminate() 终止子进程 p ,等于向子进程发送 SIGTERM 信号;
6. p.kill() 杀死子进程 p ,等于向子进程发送 SIGKILL 信号;
7. p.returncode, p.stdin, p.stdout, p.stderr, p.id
1. 父进程直接创建子进程执行程序,然后等待子进程完成
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
返回值:call() 返回子进程的 退出状态 即 child.returncode 属性;
2. 父进程直接创建子进程执行程序,然后等待子进程完成,具体可以使用的参数,参考上文 Popen 类的介绍。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
返回值:无论子进程是否成功,该函数都返回 0;但如果子进程的退出状态不是0,check_call() 抛出异常 CalledProcessError,异常对象中包含了 child.returncode 对应的返回码。
3.父进程直接创建子进程执行程序,以字符串的形式返回子进程的输出。
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
返回值:字符串形式的子进程的输出结果,但是如果子进程的 退出状态 不是0,那么抛出异常 CalledProcessError,异常对象中包含了 child.returncode 对应的返回码。
注意:check_output() 的函数签名中没有参数 stdout,调用该方法时,子进程的输出默认就返回给父进程。
注意:使用上面提到的三个方法:call()、check_call() 和 check_output() 时,尽量不要将参数 stderr 和 stdout 设置为 subprocess.PIPE,这几个函数默认都会等待子进程完成,子进程产生大量的输出数据如果造成管道堵塞,父进程再等待子进程完成可能造成死锁。
标签:取数据 size output 模块 其他 工作 div error 可调用对象
原文地址:https://www.cnblogs.com/bsszds930/p/12956010.html