python打开文件报错,安装python报错
问题的根源
代码如下:
# -*-编码:utf-8 -*-
从gooey导入Gooey,GooeyParser
定义运行(关键字):
打印(关键词)
@Gooey(
Text _ controls=true,#打开终端支持彩色。
语言=中文,
header_show_title=False,
程序名=测试,#程序名
Encoding=utf-8 ,#设置编码格式,打包时遇到问题。
progress _ regex=r progress:(\ d)% $ ,# regular,用于对运行时进度信息建模
default_size=(905,640),
)
def main():
描述=测试
parser=GooeyParser(描述=描述)
Parser.add _ argument (keywords ,help= keywords )
args=parser.parse_args()
运行(args.keywords)
主()
随便输入搜索引擎,发现其他人都在问或者反馈类似的问题,很可能是偏题。找了一圈也没找到解决办法,就出丑把解决办法记录在这里,方便有需要的人查阅。
解析过程
Python3.8环境,用Gooey的gui库(也是我第一次接触这个库),说打包后无法显示中文。
出于谨慎,我先把源代码过了一遍,发现很丝滑,没有任何问题。
然后用pyinstaller打包,然而,令人震惊的事情发生了。用pyinstaller打包后,输入中文时出错(这里直接打包了。py源文件)。
感谢楼下@fanvalen的热心回复和补充。Gooey打包exe的方法不同于常见的打包方式,需要pyinstaller build.spec。详见@fanvalen回复地板。
实测的build.spec包仍然不能正常输出中文,运行包后输入中文也不会出现错误信息,程序只会一直卡死。这个解决方案也是适用的。
错误消息如下所示:
线程Thread-1中出现异常:
回溯(最近一次呼叫):
文件 threading.py ,第932行,in _bootstrap_inner
文件 threading.py ,第870行,运行中
文件 gooey\gui\processor.py ,第70行,in _forward_stdout
文件 gooey\gui\processor.py ,第84行,in _extract_progress
UnicodeDecodeError错误:“utf-8”编解码器无法解码位置0处的字节0xc4:无效的连续字节
我一看到错误就发现是编码问题,所以我觉得应该从编码开始。
解决方案想法
本着“大胆假设,仔细验证”的精神,将代码gooey的encoding=utf-8 参数改为gbk、gb2312、gb18030,但直接报错。
然后我改变了主意,是不是输出编码有问题。
所以把print语句编码成utf-8再解码成utf-8和gbk还是无果。
我以为在代码里改会更简单快捷,但是我很无奈。看来我得回到错误代码了。
查看错误代码gooey/gui/processor.py的第70行和第84行,找到库的安装路径。
python安装路径下的libsite-packages/gooey/GUI/processor . py
乍一看,参数self.encoding很可疑。
通过跟踪上下文的运行过程,有趣的是发现代码如下:
def _forward_stdout(self,process):
读取“进程”的标准输出,并转发行和进程
给任何感兴趣的订户
虽然正确:
line=process . stdout . readline()#同样的代码在打包之前这里读的是utf-8代码,但是打包之后就变成了gbk代码,所以一旦打包就无法输出中文了。感兴趣的朋友可以打印到控制台看看结果。
如果不行:
破裂
_进步=自我。_extract_progress(行)
pub.send_message(事件。PROGRESS_UPDATE,progress=_progress)
如果_progress为None或self.hide_progress_msg为False:
pub.send_message(事件。控制台_更新,
msg=line . decode( gbk )# decode默认参数self.encoding改为gbk打包显示中文。
pub.send_message(事件。执行_完成)
def _extract_progress(self,text):
方法在文本中查找进度信息
用户提供的正则表达式和计算说明
#单子式调度以避免if/else汤
Find=partial (re。search,string=text.strip()。decode( gbk )# decode默认参数self.encoding改为gbk打包显示中文。
regex=unit(self.progress_regex)
match=bind(regex,find)
结果=绑定(匹配,自身。_计算_进度)
回送结果
同样的代码,封装前是utf-8,封装后变成了gbk。
想必两个库都是外国人写的,其中一个不太支持中文。也可能是window下默认的编码问题。(手动搞笑,哈哈哈哈)
因为打包后变成了gbk编码,自然解码成gbk。
一旦这两个参数被改变和固定,我不想再进一步。我对《胶粘》不太感兴趣,尽管它是一部伟大的作品。
请注意,打包后记得改回原来的参数,以免出现其他意外情况。
摘要
这是一个临时的解决办法,但不是永久的解决办法。要想彻底解决,估计只有把pyinstaller和Gooey的代码打包过程研究透彻,否则估计有点难度。
在Windows 10环境下打包后,经过几波测试已经可以输出中文,没有发现其他异常,完美解决。请自测其他系统。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。