解决Gooey在打包成exe文件后打印中文报UnicodeDecodeError: 'utf-8' codec can't decode

问题

在使用Gooey这个工具生成GUI的时候,没有打包前测试是好的,但是当打包成exe文件后,双击exe运行填入所需选项执行报UnicodeDecodeError: 'utf-8' codec can't decode的错误。

PS C:\Users\faces\Desktop\gooey demo\dist> .\auto.exe
Exception in thread Thread-1:
Traceback (most recent call last):
  File "threading.py", line 926, in _bootstrap_inner
  File "threading.py", line 870, in run
  File "site-packages\gooey\gui\processor.py", line 71, in _forward_stdout
  File "site-packages\gooey\gui\processor.py", line 84, in _extract_progress
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 13: invalid start byte

通过查找github中提交的issue发现是打包后环境的encoding与打包时的encoding不一致导致的问题。

解决方案

在Gooey装饰器中加入关键字参数encoding='cp936'

from gooey import Gooey, GooeyParser
@Gooey(encoding='cp936')
def main():
    parser = GooeyParser(description="Export music lite") 
    parser.add_argument('exe文件', widget="FileChooser")
    parser.add_argument('flac文件夹', widget="DirChooser")
    parser.add_argument('MP3导出文件夹', widget="DirChooser")
    args = parser.parse_args()
    print(args)
if __name__ == "__main__":
    main()

问题

接下来我想更改Gooey生成的GUI页面为中文,那么代码改为


from gooey import Gooey, GooeyParser
@Gooey(encoding='cp936', language='chinese')
def main():
    parser = GooeyParser(description="Export music lite") 
    ...

这时候执行会报如下错误

PS C:\Users\faces\Desktop\gooey demo\dist> .\auto.exe
Traceback (most recent call last):
  File "auto.py", line 17, in <module>
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\python_bindings\gooey_decorator.py", line 87, in inner2
  File "auto.py", line 12, in main
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\python_bindings\gooey_parser.py", line 114, in parse_args
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\python_bindings\gooey_decorator.py", line 82, in run_gooey
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\gui\application.py", line 21, in run
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\gui\application.py", line 28, in build_app
  File "site-packages\gooey-1.0.3-py3.7.egg\gooey\gui\lang\i18n.py", line 24, in load
  File "json\__init__.py", line 293, in load
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 20: illegal multibyte sequence

解决方案

从报错信息中可以看到是因为load代码的时候使用encoding='cp936'去加载文件导致的错误,那么简单粗暴的方法是编辑site-packages\gooey-1.0.3-py3.7.egg\gooey\gui\lang\i18n.py这个文件

找到

    with io.open(os.path.join(language_dir, json_file), 'r', encoding=encoding) as f:
      _DICTIONARY = json.load(f)

修改为

    with io.open(os.path.join(language_dir, json_file), 'r', encoding='utf-8') as f:
      _DICTIONARY = json.load(f)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 幸运的碰到兼职销售手动皮影。第一次错失机会,内心是想去尝试的,却因为怯懦,因为顾虑朋友,因害怕别人说你出风头,所以...
    折草阅读 1,729评论 0 0
  • SparkStream在处理流数据时,按时间间隔把数据分成小批,在一个小批中利用RDD的函数完成各种运算。如果要在...
    达微阅读 4,771评论 0 2
  • 准确的评价能给学生明确的反馈,明知进步的方向,给予坚实的动力。 课上积极思考,不怕错误,不怕遇到问题,你的错误不仅...
    onesmall阅读 1,079评论 0 1