【问题标题】:subprocess not catching stdout子进程没有捕获标准输出
【发布时间】:2020-10-18 19:25:13
【问题描述】:

我几天以来一直在试图弄清楚为什么我的 subprocess.Popen 没有捕捉到标准输出。也许这与子进程输出文件的事实有关。当我运行一个没有输出文件的子进程并且标准输出(你会在终端上看到)被咳嗽时,我发现了这一点。你能帮我如何在带有输出文件的场景中捕获它,所以我不想从文件中捕获输出,而只想捕获终端输出,所以运行输出。非常感谢任何形式的帮助。

     command = "cnvkit.py call %s -o %s" % (file, output)
     process_call = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=sfs.path('cnv_app/call_CNS/'), universal_newlines=True)
stdout, stderr = process_call.communicate()
     if process_call.returncode and stderr:
          output_call = stdout
          output_err_call = stderr
     else:
          output_call = stdout 
          process_call.poll()
          response = {'output_call': output_call, 'output_err_call': output_err_call}

【问题讨论】:

  • 您可能想与stdout=subprocess.PIPE 分享更多细节Popen,然后stdout, stderr = process_call.communicate() 应该给您留下stdout,这是子进程的标准输出。注意:我似乎无法弄清楚,为什么你会得到command 作为格式化字符串然后拆分它(如果fileoutput 中有空间,也会冒着分崩离析的风险),而不是仅仅定义commandlisttuple 开头。
  • 如果你告诉命令输出到一个特定的文件名 - 那就是输出的地方,STDOUT 不再涉及。
  • @OndrejK。谢谢您的注意,是的,您是对的,如果输入有空格,则不会保存,是的,我会更正。但是你说的子进程是什么意思,是我执行的命令吗?
  • @jasonharper 当我从终端执行命令时,我得到了一些关于正在运行的进程的信息,当我在没有 stdout=subprocess.PIPE 的情况下运行它时,它也会在 django 终端中发生。这就是我想要的,不能丢失,或者在这种情况下我不能抓住它?
  • 如前所述,它通常看起来不错,它应该像那样工作。有了给定的信息,其余的主要是从水晶球中占卜。当您使用-o 调用您的其他脚本时,是否仍希望将任何内容打印到标准输出?或不?您实际上如何尝试使用它(并告诉它没有被捕获;缩进表明您只在某些情况下设置响应)。

标签: python subprocess popen


【解决方案1】:

我的子进程正在返回一个警告,该警告显然会发送到 stderr,并且由于我的 process_call.returncode 将返回 0,这对于 if 语句来说是 False,因此只捕获了空的 stdout,这就是为什么我没有得到输出。当出现警告时,stdout 全部转到 stderr 我有点失望。是的,你是对的,你需要一个水晶球来回答这个问题,但是你帮我解决了我的问题 :)

【讨论】: