subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
执行args 描述的命令,父进程等待子进程完成。返回returncode属性。上面的形参参数只是常用的,该函数的完整形式和Popen构造函数相同。
返回结果p只是一个return code,dir命令的结果是直接打印出来的,并不作为结果返回。如果需要将dir的命令执行结果作为结果返回的话,用subprocess.check_output() 。其中,shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串(如果是以list存储的数组,此时也会被隐式地转为字符串执行),当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
父进程等待子进程完成,如果返回码是0则返回,否则抛出CalledProcessError。CalledProcessError对象将把返回码保存在returncode属性中。
可以通过检查退出信息,如果returncode不为0,则抛出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查。
该函数不要使用stdout=PIPE或者stderr=PIPE,因为基于子进程的输出流量可能导致死锁。当需要管道时,使用Popen和它的communicate()方法。
subprocess.check_output()
父进程等待子进程完成,子进程的输出作为字节字符串返回。同样,如果返回码非零,它将引发CalledProcessError。
底层Popen接口: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)
其实上面的三个函数都是基于Popen()的封装。与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)。
import subprocess
child1 = subprocess.Popen([“ls”,”-l”], stdout=subprocess.PIPE)
child2 = subprocess.Popen([“wc”], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
此外,还可以利用communicate()方法来使用PIPE给子进程输入,类似于参数传入:
import subprocess
child1 = subprocess.Popen([“cat”], stdin=subprocess.PIPE, stdout=subprocess.PIPE,shell=True)
output = child1.communicate(“conf.py”)
print output
Popen.communicate与进程交互:将数据发送到标准输出。从标准输出和标准错误读取数据,直至到达文件末尾。等待进程终止。可选的input 参数应该是一个要发送给子进程的字符串,如果没有数据要发送给子进程则应该为None。
Popen.communicate()返回一个元组(stdoutdata, stderrdata)。
注意如果你需要发送数据到进程的标准输入,你需要以stdin=PIPE创建Popen对象。类似地,在结果的元组中若要得到非None的数据,你还需要给出stdout=PIPE和/或stderr=PIPE。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219885.html原文链接:https://javaforall.net
