py2exe转换程序的输出一次全部接收

本文关键字:一次 全部 程序 转换 输出 py2exe | 更新日期: 2023-09-27 17:50:50

我制作了一个python控制台脚本,并使用py2exe将其转换为.exe(我在我的设置文件中使用了console = ['test.py']行)。

程序解析文件,并在解析过程中打印出已解析文件的多少内容。典型的输出是:

Processing (currently at 1%)
Processing (currently at 4%)

等。当在cmd窗口中运行文件时,它会像预期的那样工作。

我还创建了一个非常小的c# WPF程序,它只运行解析器:
Process p = new Process();
p.StartInfo = new ProcessStartInfo(@"C:'temp'test.exe");
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
Task t = new Task(() =>
{
    p.Start();
    p.BeginOutputReadLine();
    p.WaitForExit();
    p.Close();
});
t.Start();

p_OutputDataReceived处理程序只是将接收到的输出发送到一个文本框。这是有效的,我已经在其他程序上测试了它,在那里我从程序中得到了我期望的输出。

然而当我运行解析器(使用py2exe创建的解析器)时,我在解析器完成后得到所有输出。所以最后我得到了所有正确的输出,但是我同时得到了所有正确的输出……

(注意,我没有得到一个大的输出,而是所有预期的输出,但仍然是在同一时间)


所以这里要非常清楚:

  • 如果我从命令窗口运行解析器,我将逐个得到输出
  • 我已经测试运行c#控制台程序,而不是py2exe生成的程序,这是有效的(我得到一个接一个的输出)

py2exe转换程序的输出一次全部接收

Python检查sys.stdout(程序的标准输出)是否为控制台。如果是,Python立即刷新写缓冲区,以便用户可以看到它。否则,写操作将被缓存并一次输出:

  • 写缓冲区已满或

这背后的逻辑是更好的性能,因为当重定向标准输出到文件或其他程序时,通常没有人关心输出何时发生。

你可以通过在Python解析器脚本的战略位置(即直接在打印状态行之后)包含sys.stdout.flush()来修复这个

Btw:如果您将解析器的输出重定向到more,您应该能够观察到相同的延时行为,例如:
C:'temp'test.exe | more