赞
踩
学了一段时间的Python,但都是自己用。前不久写了个数据转换的小工具,同事很感兴趣,问能否共享给他使用。由于他不是技术人员,如果让他再去安装和运行什么Python就太麻烦了,就决定试试用PyInstaller来打个包,做成一个可执行文件。
按照网上的说明,安装好PyInstaller,打包……试了试,可以正常运行,就通过邮箱发给同事了。
翌日,同事发邮件过来,说我发给他的程序打不开,并附了个截图。
问题1:
“此文件的版本与正在运行的windows版本不兼容。请检查计算机的信息以了解需要x86还是x64版本的程序,然后联系软件发布者”
经过了解,对方使用的是Win7 32位系统,我使用的是Win10 64位,Python 3.6 64位。
上网搜索后,发现是因为PyInstaller打包的程序,与Python的版本有关(因为安装时,pip已经自动按照Python的版本进行了匹配),64位的Python,打包的就是64位程序,32位的Python,打包的就是32位系统。而且还建议最好不要按照64位的Python,否则打包的文件,会造成很多人用不了。
问题2:
即使对方恰好也是64位Windows,也会有问题,会提示“api-ms-win-crt-*-l1-1-0.dll”找不到,无法运行。因为我用到了一些需要调用windows API的程序代码,而这些代码在打包编译后,会需要调用Windows的对应API文件入库,如果无法找到,就会报错。由于用于Windows的产品,几乎都是采用Visual C++来编写的,所以必须要安装VC++运行库,否则……
问题3:
其实和上面的问题2有关系,就是打包的时候,提示Warning:lib not found的问题,主要还是没有找到这些dll文件,系统打包时还是有问题。
如何解决呢。
1.卸载64位Python,仅安装32位版本。
不,绝不妥协。凭什么我不能安装两个不同的版本。搜索后发现,可以通过安装virtualenv来解决。我可以同时安装32位系统和64位系统。但是需要分别下载和安装各自的pip库(64位的可继承使用原64的库文件)。不需要使用模拟环境的,退出即可。
2.修改SPEC文件。
换为32位版本后,重新编译时,还是会提示有lib not found的警告。此时打开*.spec文件进行编辑。
在其中的pathex字段中,添加api-ms-win-crt-*-1-0.dll的文件路径。通常如果安装了VC++运行库的话,其地址为“C:\Program Files\Windows Kits\10\Redist\ucrt\DLLs\x86”(32位操作系统)或“C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86”(64位操作系统)。此处选用的是VC++的32位版本库文件。
再次运行pyinstaller --clean demo.spec文件后,可以看到不再有lib not found的警告,生成的demo.exe也可正常运行在win7 32位的电脑上。
如果仍有提示api-ms-win-crt-*-1-0.dll文件缺失,最好还是要在目标系统上安装VC++运行库环境。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。