Pyinstaller numpy“英特尔 MKL 致命错误:无法加载 mkl_intel_thread.dll”

新手上路,请多包涵

我是 python 应用程序的新手。我正在尝试使用 pyinstaller 构建我的 python GUI 应用程序。我的应用程序依赖于以下软件包:PyQt4、numpy、pyqtgraph、h5py。我正在使用 WinPython-32bit-3.4.4.1。

我使用此命令构建应用程序:

 pyinstaller --hidden-import=h5py.defs --hidden-import=h5py.utils --hidden-import=h5py.h5ac --hidden-import=h5py._proxy VOGE.py

我使用 pyinstaller 创建的 dist 目录中的 exe 文件启动我的应用程序,它似乎工作正常,直到程序调用 numpy 并因此错误而崩溃:

英特尔 MKL 致命错误:无法加载 mkl_intel_thread.dll

mkl_intel_thread.dll 不在软件目录中;但是将文件复制到程序的根目录中我得到了同样的错误

谢谢你的帮助

原文由 f_ciriolo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

我创建了一个 hook-numpy.py 来处理这个问题:

 from PyInstaller import log as logging
from PyInstaller import compat
from os import listdir

libdir = compat.base_prefix + "/lib"
mkllib = filter(lambda x : x.startswith('libmkl_'), listdir(libdir))
if mkllib <> []:
   logger = logging.getLogger(__name__)
   logger.info("MKL installed as part of numpy, importing that!")
   binaries = map(lambda l: (libdir + "/" + l, ''), mkllib)

在我的例子中, conda 正在安装 mkl 库以加速 numpyscipy

原文由 LeonidR 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在使用 Pyinstaller 和 Numpy 时遇到了同样的问题。默认情况下,pyinstaller 似乎不考虑 numpy 二进制文件,因此您必须手动指定它。您可以添加编辑“.spec”文件“二进制文件”变量的文件,但这仅适用于您当前的程序。如果你想让它适用于你冻结的所有程序,你应该制作一个“钩子”并将它保存在 C:\Python3*\Lib\site-packages\PyInstaller\hooks 中。

我必须修改 LeonidR 的代码才能使 numpy-hook 正常工作。我使用列表理解使用更现代的 pythonic 方法重写了它:

 from PyInstaller import log as logging
from PyInstaller import compat
from os import listdir

mkldir = compat.base_prefix + "/Lib/site-packages/numpy/core"
logger = logging.getLogger(__name__)
logger.info("MKL installed as part of numpy, importing that!")
binaries = [(mkldir + "/" + mkl, '') for mkl in listdir(mkldir) if mkl.startswith('mkl_')]

“二进制文件”是一个元组列表。元组的第二项对应于您要放置“dll”的文件夹。在这种情况下是空的,因此它会将它们直接复制到“.exe”所在的主文件夹中。

原文由 j4n7 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题