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生成的程序,这是有效的(我得到一个接一个的输出)
Python检查sys.stdout
(程序的标准输出)是否为控制台。如果是,Python立即刷新写缓冲区,以便用户可以看到它。否则,写操作将被缓存并一次输出:
- 写缓冲区已满或
这背后的逻辑是更好的性能,因为当重定向标准输出到文件或其他程序时,通常没有人关心输出何时发生。
你可以通过在Python解析器脚本的战略位置(即直接在打印状态行之后)包含sys.stdout.flush()
来修复这个。
more
,您应该能够观察到相同的延时行为,例如:
C:'temp'test.exe | more