Python使用模块subproces,生成新的进程并与之通信。在Python2中,提供了call(),check_call()和check_output()函数生成新进程的API,他们也被带到了Python3。在Python3中,新增了高级函数run(),能够生成新进程并收集输出。
执行:run()函数的第一个参数是一个字符串列表,这样可以避免被shell解析特殊的字符。返回一个CompletedProcess实例,包含输出的信息或者退出状态。使用属性shell设置为True,会让subprocess生成一个新shell进程,然后再运行命令,此时第一个参数需要传递一个字符串。
执行:call()函数返回子进程的退出状态,相当于不传给run()参数check=True错误处理设置属性check为True,如果命令执行发生错误,会触发异常CalledProcessError。
执行:
当给run()属性check设置为True,相当于调用check_call()函数捕获输出上例中,执行run()函数,默认都把子进程的输出打印了,这是因为子进程的输入输出通道和父进程的一致。为了捕获输出或者错误信息,需要传递属性stdout或者stderr,设置为subprocess.PIPE。
执行:当调用run()时,check=True而且stdout=PIPE,相当于调用check_output()函数为了捕获错误消息,我们可以把标准错误重定向到标准输出,设置属性stderr为STDOUT。
执行:上例中,使用shell命令输出两个字符串,一个是标准输出,另一个把标准输出重定向到标准错误。因为设置了属性stderr,最终两个字符串都返回了。抑制输出设置stdout为DEVNULL抑制输出数据,下面的例子抑制了标准输出流和标准错误流。
执行:使用Popen实例化Popen,并且设置stdout为PIPE,调用communicate()方法捕获输出。
执行:
设置参数stdin为PIPE,然后调用communicate()方法可以向子进程传递数据。
执行:
同时设置stdin和stdout为PIPE,能够和子进程双向读取和写入数据。
执行:通过设置stdout和stderr,同时捕获输出和错误。
执行:
领取专属 10元无门槛券
私享最新 技术干货