python打开文件报错,安装python报错

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: