Pyinstaller with Scipy

在将 python 工程用 pyinstaller 打包成 exe 时,由于 import 了 scipy 的一些功能,因此生成的 exe 一直报错,经过努力终于解决。

问题来源

在 MLIT 的项目中,有使用到 scipy 库中的一个函数。因此,有 from scipy.spatial.distance import cdist 这句,但是突然不知道哪里发生了改动 (推测是某些库的版本在安装其他库时发生了变化),打包好的 exe 在执行上述 import 语句时总是报错。

Trail and Error

  1. 由于 scipy 的版本在上次发版之后发生了改变(不知为啥),现在的版本为 1.2.0. 根据 lib/site-packages/ 的痕迹推测之前的版本为 1.0.0. 但将 scipy 重装为 1.0.0 后仍然不成功。
  2. 按步骤 1 的方式操作后,scipy/spatial/_spherical_voronoi.py 中的 第 18 行 from . import _voronoi 仍然报错,大意为 cannot import name _voronoi. 其中,_voronoiscipy/spatial/文件夹下的一个 pyd 文件,为 _voronoi.pyd. 可是事实上,我在 convert 的 bat 脚本中明明有通过 hidden-import 将此文件导入进去,生成的文件夹中也确实存在这个文件,但是程序总是无法成功导入。
  3. 后来经过搜索与分析,在 convert 脚本中添加了一行 --paths="H:\Develop\Anaconda2\setup\Lib\site-packages\scipy\extra-dll",就成功了。

分析

上述方法成功后,分析成功原因。在执行 convert 脚本时,有一系列跟 scipy 有关的 warning. 大致都是说 hidden-import 的 pyd 文件的依赖 dll 找不到,而这些 warning 在我印象中以前并未出现过。在添加了 --paths="H:\Develop\Anaconda2\setup\Lib\site-packages\scipy\extra-dll 这一参数后,不再有这些 warning, exe 也可以成功执行。

资源

完整的 convert 脚本
python库版本


文章作者: taosean
文章链接: https://taosean.github.io/2019/04/02/Pyinstaller-with-Scipy/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 taosean's 学习之旅