我是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;但是如果文件复制在程序的根目录中,我得到了同样的错误
感谢您的帮助
答案 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库以加快numpy
和scipy
。
答案 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安装。