目录
1.问题背景
最近需要将之前基于TensorFlow-GPU写的深度学习分类程序分发给其他同事使用,但众所周知,深度学习的配置较为麻烦,因此在想能否程序打包,直接运行即可?
Python下面的打包库有很多,为了保险起见,没有选较为新潮的打包库,而是选择了老牌的Pyinstaller进行打包,然后就有了这篇博客。
2.问题分析
Pyinstaller有主流的两种打包方式:打包成文件夹(-D)或一个独立的文件(-F),强烈建议将程序打包为文件夹,不要打包为一个独立的文件,主要原因如下:
- 虽然独立的文件看着非常清爽,但是面对一些复杂的程序时,往往无法成功运行,却没法对打包后的程序进行修改,比如本文的这个问题,如果是独立的文件,基本无法解决。
- 并且,虽然是独立的文件,其实可以将其理解成一个压缩包,在运行时,还是会解压缩为一个名为_MEIxx的文件夹,进而运行,如果程序正常运行,在完毕时他会将这个临时文件夹删除,这样还多了解压缩的时间损耗。
- 如果你的程序并没有正常运行而是运行到一半崩溃了,上述临时文件夹可能无法被删除,长时间如此,会消耗大量的磁盘空间。
在我们将程序打包好之后,直接运行程序,出现:ModuleNotFoundError: No module named 'tensorflow.python._pywrap_tensorflow_internal',如下图:
3.解决方法
我们尝试在打包后的文件夹中中搜索_pywrap_tensorflow_internal,发现是可以找到的,说明只是路径不对,程序没有正确找到。这时我们只需要在dist文件夹下面的主程序入口文件夹(如我这边是对main.py打包,那么就是在main文件夹下)新建一个文件夹:“tensorflow/python”,然后将搜索到的_pywrap_tensorflow_internal文件剪贴到该文件夹即可!
注:如果是单一的文件模式打包,那我们就没有办法修改这个文件的路径了!所以,一定要打包为文件夹哦~~~