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