2017-05-28 54 views
0

我有一个名为program的编译程序,它需要一个名为2phase_eff的参数。我想从python运行此程序,但也能够实时查看shell的进度(它会输出各种进度消息)。到目前为止,我已经成功地在实际运行它,它是做使用下面的代码运行后观察输出:获取子进程模块以启动shell窗口

import subprocess 
subprocess.Popen("program 2phase_eff", stdout=subprocess.PIPE, shell=True).communicate() 

是的,这确实输出的所有中间的东西在最后,但这里有两个问题

  1. 我不能看到cmd外壳和
  2. 输出是不是实时

我如何可以调整上述命令履行AB两个目标?谢谢。

+0

你正在使用哪个操作系统? – Gahan

+0

我正在使用Windows 7 – user32882

+0

相关https://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess – stovfl

回答

0

要显示命令shell,您需要将creationflags的值传递给subprocess.Popen()的调用。在Windows中,这是ShellExecute()nShowCmd参数。它是一个介于010之间的整数。 Popen()的默认值为零,相当于SW_HIDE。您可以在https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx找到可用值的完整列表。

缺少实时输出是使用Popen.communicate()stdout=subprocess.PIPE组合的结果。输出缓冲在内存中,直到子进程完成。这是因为.communicate()会返回输出结果,直到方法调用返回时才会得到结果。

您可以尝试将文件描述符传递给它并轮询。

+0

那么我应该用什么结束命令来达到预期的效果? – user32882

+0

@ user32882:我无法回答,因为我不知道期望的结果是什么。 'Popen.communicate()'等到子进程完成。所以如果你想在这之前看到输出,不要管输出。你做什么取决于你想要什么。你可以改变你的命令为''program 2phase_eff“> myfile.txt'而不是'stdout'。你问了一个调整。真的没有一个。 – BoarGules