py2exe可执行文件没有正确刷新标准输出

时间:2015-11-10 19:11:28

标签: python qt python-2.7 stdout py2exe

我有一个python脚本,可以输出一些5位数字。我通过Qprocess调用此脚本并读取我稍后使用的输出。 在Windows上,脚本打包成一个py2exe的可执行文件,并调用可执行文件。

当我从终端运行可执行文件或脚本时,输出正常,但是当我通过Qprocess调用可执行文件时,我得到了垃圾。

我打印的脚本部分就像这样

print number
sys.stdout.flush() 

我尝试用printsys.stoud.write(number)替换sys.stoud.write(number + '\n'),但没有成功。

我的py2exe脚本是:

setup(
    console=['number.py'],
    options = {
        'py2exe' : {
        'bundle_files': 1,
        'compressed': True
        }   
    },
    zipfile = None
)

我也尝试将console=['number.py']更改为windows=['number.py'], 也没有成功。

我知道-u的{​​{1}}切换,但我需要将其作为可执行文件,我也不确定这是否会起作用。

我在搜索引擎优化和谷歌上都进行了搜索,但是每个人都建议使用python,这对我的情况来说还不够。

当我使用记录器检查输出时,我可以看到输出的大小不同,范围从6个字符到11加1,然后再从6到11,依此类推。

我使用的是Python 2.7,Qt是4.8,我在Windows 7和8上测试过。在Linux上,一切运行顺利。

我已经浪费了将近一整天的时间,我将不胜感激任何帮助

我在使用sys.stdout.flush()时也尝试使用\r\n,但这也不起作用。

尝试将其设置为有效,我使用sys.stoud.write()开关< python>调用-u脚本,将调用替换为可执行文件。它似乎工作正常,输出的大小总是6。 这是为什么?

查看py2exe提供的options,我看到python -u myscript.py选项表示当unbuffered无缓冲Truestdout时({1}}我认为默认情况下是无缓冲的)。

  

unbuffered:如果为true,则使用无缓冲的二进制stdout和stderr

我在stderr中设置'unbuffered': True,这也不起作用。

1 个答案:

答案 0 :(得分:0)

您可能需要添加

参考:os.fsync(fd)

  

强制将filedescriptor fd文件写入磁盘。在Unix上,这会调用本机fsync()函数;在Windows上,MS _commit()函数。

     

如果您从Python文件对象f开始,首先执行f.flush(),然后执行os.fsync(f.fileno()),以确保与f关联的所有内部缓冲区都写入磁盘