从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吗?谢谢因为当库可以为你做事情时,你自己做这些事情是低效的、冗长的、容易出错的;但不要从我这里拿走,在子流程
文档中找到相同的建议。也许可以回顾一下相关章节并进一步讨论这个话题。如果这解决了你的问题,请考虑投票和/或接受它。或者,你可以发布自己的答案,并接受它。接受答案可以帮助未来的访问者将问题标记为已解决。另见