从Python Popen().communicate()获取stderr

从Python Popen().communicate()获取stderr,python,subprocess,Python,Subprocess,我有下面的代码片段。最后两个打印语句是否相等?请告知 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) 否,Popen对象的std

我有下面的代码片段。最后两个打印语句是否相等?请告知

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)

否,
Popen
对象的
stderr
成员是一个文件句柄,而不是以前写入该文件句柄的字符串

无论如何,您可能不应该直接使用
Popen
;这是其中一种情况,在这种情况下,您只需要一个
run
调用,它实际上也会提供您需要的接口

P1=subprocess.run(shlex.split(hdfs\u rm\u命令),
捕获输出=真,
通用(新行=真)
如果P1.returncode!=0:
打印(P1.stderr)

在这种情况下,我是否不需要调用communicate()来等待我的命令完成?不,
run
直接使用低级
Popen
时,会处理您自己需要处理的所有事务。它可以工作,但您能解释一下为什么您更喜欢使用subprocess而不是Popen吗?谢谢因为当库可以为你做事情时,你自己做这些事情是低效的、冗长的、容易出错的;但不要从我这里拿走,在
子流程
文档中找到相同的建议。也许可以回顾一下相关章节并进一步讨论这个话题。如果这解决了你的问题,请考虑投票和/或接受它。或者,你可以发布自己的答案,并接受它。接受答案可以帮助未来的访问者将问题标记为已解决。另见