pyinstaller打包python二进制程序 2018-11-04 08:07:59 Steven Xeldax python由于是脚本语言所以源代码都是可以的,有时候作为项目发布又不想让别人看到代码,这种时候只能将程序打包为二进制了。 pyinstaller是一个非常简单的打包python的py文件的库。 安装pyinstaller直接用pip就可以 ``` pip install pyinstaller ``` 目前pyinstaller默认安装的是只有3.x版本的python才能打包,如果想要python2.7能够使用只能选择将pyinstaller降级安装。 pyinstaller几个需要注意的参数: ### -F指令 使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹,强烈强烈建议使用这种打包方式,干净。 ### -w指令 直接发布的exe应用带命令行调试窗口,在指令内加入-w命令可以屏蔽 ### -p指令 这个指令后面可以增加pyinstaller搜索模块的路径。因为应用打包涉及的模块很多。这里可以自己添加路径。 ## 采坑 不是所有的代码都能打包,即使打包成功有时也会有很多乱七八糟的问题。这里在打包机器学习的程序的时候就遇到了很多麻烦。 在打包机器学习的时候会遇到这个问题 ``` ModuleNotFoundError:No module named typedefs ``` 经过不断搜索发现是sklearn和scipy库的问题。这时候需要修改之前pyinstaller运行时生成的spec文件。 .spec文件中将、 ``` hiddenimports=[] ``` 修改为: ``` hiddenimports=['cython', 'sklearn', 'sklearn.ensemble','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree','sklearn.tree._utils','scipy._lib.messagestream'] ``` 后,再运行命令pyinstaller x.spec 可以参考https://stackoverflow.com/questions/31774906/why-do-i-get-an-importerror-when-building-a-exe-with-pyinstaller stackoverflow给出了很好的解释 ``` You can still use pyinstaller by adding the following to your command: --hidden-import sklearn.neighbors.typedefs or by adding the following to your .spec file: hiddenimports=['cython', 'sklearn', 'sklearn.neighbors.typedefs'] ``` ##采坑2 运行打包后的程序会发现它会不断的启用进程直到系统卡死。 解决办法是给多进程加入**freeze_support**并且将程序全部加入到__main__内部 ``` if __name__=='__main__': # 在此处添加 multiprocessing.freeze_support() # 这里是你的代码 # ...... ``` if __name__=='__main__': 外面不能有代码! 参考 https://blog.csdn.net/zyc121561/article/details/82941056 https://qiita.com/jokitsu2/items/4020ee85056f3a21c11b