Python Popen().communicate()获取stderr时两条打印语句是否等效?
P1 = Popen(shlex.split(hdfs_rm_command), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) o4, e4 = P1.communicate() if P1.returncode != 0: print(e4) print(P1.stderr)
结论:两条print语句的输出完全不等效
print(e4)会输出命令执行产生的完整标准错误文本:communicate()方法会一次性读取子进程所有标准输出、标准错误缓冲区的内容,返回值中的e4就是完整的 stderr 文本,打印它会直接输出命令运行时抛出的错误信息。print(P1.stderr)只会输出文件对象的描述信息,完全不是错误内容:P1.stderr本身是绑定子进程错误流的文件对象,调用communicate()后这个文件对象会被自动关闭,直接打印只会输出类似<_io.TextIOWrapper name=5 encoding='UTF-8'>的对象元信息,和错误内容没有任何关系。- 补充说明:就算没有调用
communicate(),直接打印P1.stderr也不会输出错误内容,需要调用read()类方法才能读取流内的文本,但直接读取流容易出现缓冲区死锁问题,官方更推荐使用communicate()来获取子进程输出。
内容的提问来源于stack exchange,提问作者Vishal Agarwal
相关产品推荐
相关产品推荐

