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

时间:2016-02-18 10:13:17

标签: python numpy dll pyinstaller intel-mkl

我是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;但是如果文件复制在程序的根目录中,我得到了同样的错误

感谢您的帮助

7 个答案:

答案 0 :(得分:7)

我使用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_')] 

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

答案 1 :(得分:2)

我遇到了同样的问题。作为一种解决方法,我手动复制了DLL,如https://stackoverflow.com/a/34893933/4089081

中所述

我试图找到更好的解决方案。

答案 2 :(得分:1)

我创建了一个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

答案 3 :(得分:1)

我只是将numpy + mkl更新到最新版本,你可以从here下载numpy + mkl

答案 4 :(得分:0)

j4n7 的答案非常有用,但是,它可能有也可能没有错误。 compat.base_prefix使用反斜杠(至少对我而言),但然后它们与"/Lib/site-packages/numpy/core"(正斜杠)连接。

>>> from PyInstaller import compat
>>> compat.base_prefix
'C:\\Python34'
>>> mkldir = compat.base_prefix + "/Lib/site-packages/numpy/core"
>>> mkldir
'C:\\Python34/Lib/site-packages/numpy/core'

如您所见,它在路径中生成向前和向后斜杠。

这是我的步骤,允许我将numpy mkl文件捆绑到一个文件中。请注意,我的特定应用程序使用matplotlib,我遇到的问题是每次单击按钮(tkinter)执行绘图时,应用程序崩溃。

<强>步骤

首先:使用以下代码构建您的应用

pyinstaller --onefile --windowed yourpythonappnamehere.py

第二次:打开.spec文件并将其添加到该文件中。显然,请确保首先存在以下文件。你可能没有Python34所以只是一个友好的警告,不要盲目复制。

mkl_dlls = [('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_avx.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_avx2.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_avx512.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_core.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_def.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_intel_thread.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_mc.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_mc3.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_rt.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_sequential.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_tbb_thread.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_avx.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_avx2.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_avx512.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_cmpt.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_def.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_mc.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_mc2.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\mkl_vml_mc3.dll', ''),
 ('C:\\Python34\\Lib\\site-packages\\numpy\\core\\libiomp5md.dll', '')]

第三次:其中显示binaries=None,更改为binaries=mkl_dlls

a = Analysis(['yourpythonappnamehere.py'],
             pathex=['C:\\Users\\...\\Documents\\...'],
             binaries=mkl_dlls,
             datas=None,
             ....

第四:重新运行第一个步骤。构建应用程序后,进入dist文件夹并启动应用程序。我希望它适合你!

更新:如果你得到英特尔MKL致命错误:无法加载mkl_intel_thread.dll 但你可以清楚地看到mkl_intel_thread.dll在你的程序目录中,转到numpy / core并逐字复制所有没有.dll扩展名的文件,并将它们粘贴到程序的目录中并重新运行。如果它有效,那很好,但你可能想要一次删除一个,找出你需要哪些以及你不需要哪些。

答案 5 :(得分:0)

我更新了代码片段以使其与我的anaconda安装一起使用(路径不同):

from PyInstaller import log as logging
from PyInstaller import compat
from os import listdir
from os.path import join

mkldir = join(compat.base_prefix, "Library", "bin")
binaries = [(join(mkldir, mkl), '') for mkl in listdir(mkldir) if mkl.startswith('mkl_')]

更新:这只适用于Windows。我还看到github上有一个PR,有更准确的修复。见Commit

答案 6 :(得分:0)

我安装了2个版本的Python。一个基本版本的Python和一个由Anaconda安装。运行我的机器学习脚本时,它会抛出相同的错误。当我卸载两个版本中的一个(在我的情况下,我删除了Anaconda)一切正常。我使用deeplearning4j作为库,显然它很难解决这个dll,因为安装了多个Python安装。