【问题标题】:Does Popen.communicate() implicitly call Popen.wait()?Popen.communicate() 是否隐式调用 Popen.wait()?
【发布时间】:2017-06-09 11:47:17
【问题描述】:

在 Python 3 文档中,它在 https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate 下声明

等待进程终止。

这是否意味着Popen.communicate() 也调用了Popen.wait(),这样我就可以通过在p2.returncode 之前不写p2.wait() 来走捷径并执行以下操作:

  p0 = subprocess.Popen(["/usr/bin/svn", "info"], stdout=subprocess.PIPE)
  p1 = subprocess.Popen(["/bin/grep", "Revision:"], stdin=p0.stdout, stdout=subprocess.PIPE)
  p2 = subprocess.Popen(["/bin/sed", r"s/Revision: //g"], stdin=p1.stdout, stdout=subprocess.PIPE,universal_newlines=True)
  stdout, stderr = p2.communicate()# implicitly calls p2.wait() to wait for exit code?
  info_struct.exitcode = p2.returncode

而不是

  p0 = subprocess.Popen(["/usr/bin/svn", "info"], stdout=subprocess.PIPE)
  p1 = subprocess.Popen(["/bin/grep", "Revision:"], stdin=p0.stdout, stdout=subprocess.PIPE)
  p2 = subprocess.Popen(["/bin/sed", r"s/Revision: //g"], stdin=p1.stdout, stdout=subprocess.PIPE,universal_newlines=True)
  stdout, stderr = p2.communicate()# implicitly calls p2.wait() to wait for exit code?
  p2.wait()# explicit wait for exit code call
  info_struct.exitcode = p2.returncode

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:

    是的,确实如此。见source code(Python 3.6.1 版本链接):

    sts = self.wait(timeout=self._remaining_time(endtime))
    

    您不必自己致电p2.wait(),该过程已经终止。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2013-03-21
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2014-10-12
      • 2017-10-20
      • 2018-09-18
      相关资源
      最近更新 更多