我有一个python
脚本打印一些5位数字。我通过Qprocess
调用此脚本并读取我稍后使用的输出。在Windows上,脚本使用py2exe
打包成可执行文件,并调用可执行文件。
当我从终端运行可执行文件或脚本时,输出很好,但是当我通过Qprocess
调用可执行文件时,我得到了垃圾。
我打印的脚本部分是这样的
print number
sys.stdout.flush()
我尝试用print
和sys.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
的python
开关,但我需要将它作为可执行文件,我也不确定这是否会起作用。
我在搜索引擎优化和谷歌搜索了但是每个人都建议使用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
无缓冲的stdout
和stderr
(我认为默认情况下是无缓冲的)时使用。
unbuffered:如果为true,则使用无缓冲的二进制stdout和stderr
我在'unbuffered': True
设置setup.py
,这也没有用。
您可能需要添加os.fsync(sys.stdout.fileno())
。
参考:os.fsync(fd)
强制将filedescriptor fd文件写入磁盘。在Unix上,这会调用本机fsync()函数;在Windows上,MS _commit()函数。
如果您从Python文件对象f开始,首先执行f.flush(),然后执行os.fsync(f.fileno()),以确保将与f关联的所有内部缓冲区写入磁盘。