在将 python 工程用 pyinstaller 打包成 exe 时,由于 import 了 scipy 的一些功能,因此生成的 exe 一直报错,经过努力终于解决。
问题来源
在 MLIT 的项目中,有使用到 scipy 库中的一个函数。因此,有 from scipy.spatial.distance import cdist
这句,但是突然不知道哪里发生了改动 (推测是某些库的版本在安装其他库时发生了变化),打包好的 exe 在执行上述 import 语句时总是报错。
Trail and Error
- 由于 scipy 的版本在上次发版之后发生了改变(不知为啥),现在的版本为 1.2.0. 根据
lib/site-packages/
的痕迹推测之前的版本为 1.0.0. 但将 scipy 重装为 1.0.0 后仍然不成功。 - 按步骤 1 的方式操作后,
scipy/spatial/_spherical_voronoi.py
中的 第 18 行from . import _voronoi
仍然报错,大意为cannot import name _voronoi
. 其中,_voronoi
为scipy/spatial/
文件夹下的一个 pyd 文件,为_voronoi.pyd
. 可是事实上,我在 convert 的 bat 脚本中明明有通过hidden-import
将此文件导入进去,生成的文件夹中也确实存在这个文件,但是程序总是无法成功导入。 - 后来经过搜索与分析,在 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 也可以成功执行。