Pyinstaller numpy"Intel MKL FATAL ERROR:无法加载mkl_intel_thread.dll"

f_c*_*olo 12 python dll numpy 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢你的帮助

j4n*_*4n7 9

我使用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_')] 
Run Code Online (Sandbox Code Playgroud)

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

  • 你能详细说明吗?我面临同样的问题,但我不明白,如果我创建hook.py,并将其保存到C:\ Python3*\Lib\site-packages\PyInstaller\hooks我将如何在我的代码中调用它,以便它还读取文件? (2认同)

Leo*_*idR 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)
Run Code Online (Sandbox Code Playgroud)

就我而言,conda是安装 mkl 库来加速numpyscipy.