1 问题描述
在windows10下,使用pyinstaller制作了一个exe文件,其中使用了 ‘runtime_tmpdir=’.’’,以便让该exe解压的_MEIxxxxxx 文件与exe文件在同一个目录下。
在将该exe放在没有中文字符的路径下时,程序能够很好的解压,并能正常支持。但是,当将其放在含有中文字符的路径下时,程序无法运行,抛出异常。
2 问题分析
这是关于exe是否支持中文路径的问题,pyinstaller之前解决过该问题。参见下面的网址。
https://pyinstaller.readthedocs.io/en/stable/CHANGES-3.html?highlight=unicode#v3-3-known-issues
在网上也能搜索到一些帮助。
但这里出现的问题,并不是python的不支持的问题。而是由bootload解压时不支持问题。
上述问题的一个现象是:如果exe文件位于中文路径 “D:/test/”,然后 _MEIxxxxxx文件在"D:/test/"下面,程序能够正确执行;但是如果把exe文件放在含中文的路径下面,如"D:/test中文/"下,则 _MEIxxxxxx file 被解压到根目录"D:/"下,致使python再运行时,无法找到解压的库文件而出错。
所以,根源在于pyinstaller解压的问题。
pyinstaller解压是用一个独立的程序bootloader来完成的,在windows下,该程序路径如下:envs\虚拟环境名称\Lib\site-packages\PyInstaller\bootloader\ 下面。如下:
如果是64位的,则在下面的Windows-64bit文件夹下,如下图:
分别对应不同的运行模式下的。
3 问题解决
关于bootload不支持中文的问题,这里有一个解释和解决方案:https://github.com/pyinstaller/pyinstaller/issues/5184
这是bootload的一个缺陷,目前,在这个分支版本中解决了这个问题。
https://github.com/rokm/pyinstaller/tree/fix-5184
但是在正式的pyinstaller中还没有解决。期待下个正式的pyinstaller可以解决。
关于这个版本,及bootloader编译后的windows下64位程序,在这里可以查找:https://download.csdn.net/download/kevinshift/12889701
bootloader的重新编译方法,可参考作者的另一篇文章:https://blog.csdn.net/kevinshift/article/details/108817956