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

问题描述 投票:3回答:1

我有一个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'],也没有成功。

我知道-upython开关,但我需要将它作为可执行文件,我也不确定这是否会起作用。

我在搜索引擎优化和谷歌搜索了但是每个人都建议使用sys.stdout.flush(),这对我的情况来说还不够。

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

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

我浪费了差不多一整天的时间,我很感激任何帮助


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

试图让这个工作,我用python开关<-u>调用python -u myscript.py脚本替换了对可执行文件的调用,它似乎工作正常,输出的大小总是6.这是为什么?


看看py2exe提供的options,我看到有unbuffered选项,当True无缓冲的stdoutstderr(我认为默认情况下是无缓冲的)时使用。

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

我在'unbuffered': True设置setup.py,这也没有用。

python qt python-2.7 stdout py2exe
1个回答
0
投票

您可能需要添加os.fsync(sys.stdout.fileno())

参考:os.fsync(fd)

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

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

© www.soinside.com 2019 - 2024. All rights reserved.