首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >subprocess.call()和subprocess.Popen.communicate()有什么区别吗?

subprocess.call()和subprocess.Popen.communicate()有什么区别吗?
EN

Stack Overflow用户
提问于 2021-05-11 12:19:42
回答 2查看 25关注 0票数 0

在Python2.7上,我在运行shell命令时使用了subprocess.call(my_cmd)

但是,我需要检查这些命令的输出,所以我将它们替换为subprocess.Popen.communicate()

代码语言:javascript
复制
    command_line_process = subprocess.Popen(my_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    process_stdout, process_stderr = command_line_process.communicate()
    logging.info(process_stdout)
    logging.info(process_stderr)

除了后一种方法可以打印输出之外,这两种方法之间是否有区别?

我想知道用subprocess.Popen.communicate()替换所有的subprocess.call()是否可以。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-11 12:39:03

正如文档已经告诉您的那样,您希望尽可能避免使用Popen

Python2.7中的subprocess.check_output()函数允许您从子进程中检索输出,但在其他方面与check_call()的工作方式基本相同(反过来,它与call的唯一不同之处在于,如果子进程失败,它将引发异常,这是您通常希望和需要的)。

Popen的情况是,如果需要的话,它可以让你构建像这样的新的高级函数(比如Python 3.5+中的subprocess.run(),它的功能更加通用,基本上包含了上面三个函数的功能)。它们都在幕后使用Popen,但是如果您直接使用子流程对象,它会很麻烦,并且需要您处理与管理子流程对象相关的几个细节;那些更高级别的函数已经为您完成了这些工作。

通常情况下,如果希望子进程与主Popen脚本并行运行,则需要Python子进程。没有简单的库函数可以帮你做到这一点。

票数 1
EN

Stack Overflow用户

发布于 2021-05-11 12:28:48

如果检查系统中的源代码,就会发现subprocess.call是通过调用subprocess.Popen.wait实现的。实际上,该模块中的所有内容都是用subprocess.Popen实现的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67480505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档