今天在用pyinstaller打包的时候,遇到一个报错

File /home/username/anaconda3/envs/envname/lib/python3.5/site-packages/PyInstaller/loader/pyimod03_importers.py
   exec(bytecode, module.__dict__)
File "site-packages/astor/__init__.py",line 24,in 
FileNotFoundError: [Errno 2] no such file or directory:"/temp/_MEI24122/astor/VERSION

这里看到pyinstaller有一个很奇怪的骚操作,要去系统临时文件夹里面找一个VERSION文件

1. 寻找”罪魁祸首”

根据错误提示定位到下列文件line 24

/home/username/anaconda3/envs/envname/lib/python3.5/site-packages/astor/__init__.py

发现这里通过读取外部文件的方式获取软件版本信息

ROOT = os.path.dirname(__file__)
with open(os.path.join(ROOT, 'VERSION')) as version_file:
    __version__ = version_file.read().strip()

pyinstaller在打包的时候默认情况下是不会把外部文件打包的,只会放在临时文件夹中供临时调用
当临时文件被系统自动清除的时候,调用可执行文件就会报错

2. 解决方法

astor软件包读取自身版本信息,这行代码并没有什么用(准确地说,是没有被其他地方调用)
直接把上述三行代码注释掉,重新打包即可

当然,更加正式的做法,是把这个版本文件的完整路径添加到待打包文件的spec文件里的Analysis[data]选项中
具体方法可以出门左转,参考我之前的一篇文章,见下方第二个参考资料

3. what’ more

为什么同样的文件打包,我之前在另一台电脑的虚拟机上没有遇到这个情况
网上有小伙伴说是astor版本的原因, 0.8.1版本会遇到这个问题,可以通过降版本的方式解决
我打开另一台电脑的虚拟机,首先查看了一下astor的版本

>> pip list | grep astor
astor            0.7.1

果然是低版本程序
然后找到相应的文件 astor/__init__.py,果然有新发现

__version__ = '0.7.1'

大功告成, 原因、解决方案算是都找到了
至于这个astor到底是干啥的,据说是个Python资源管理工具
反正网上资料很少,官网也没看懂,贴上官网地址,有兴趣的小伙伴可以研究一下

参考资料:
python3.7 pyinstaller 打包exe可执行文件报错
pyinstaller打包动态库
astor官网

文章来源于互联网,如有雷同请联系站长删除:pyinstaller可执行文件报错astor

发表评论