Pyinstaller numpy " Intel MKL фатальная ошибка:не удается загрузить поток mkl intel.файл DLL"
Я новичок в приложениях python. Я пытаюсь создать приложение python GUI с pyinstaller. Мое приложение зависит от следующих пакетов: 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
Я запускаю свое приложение с exe-файлом в каталоге dist, созданном pyinstaller, и, похоже, работает нормально, пока программа не вызовет numpy и не сбой с этой ошибкой:
Intel MKL фатальная ошибка: не удается загрузить mkl_intel_thread.dll файлы
в mkl_intel_thread.dll нет в каталоге программного обеспечения; но с файлом, скопированным в корневой каталог программы, я получил ту же ошибку
Спасибо за помощь
7 ответов
Я создал 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
.
У меня была такая же проблема с использованием Pyinstaller и Numpy. По умолчанию pyinstaller, похоже, не учитывает двоичные файлы numpy, поэтому вам нужно указать его вручную. Вы можете добавить файлы редактировании ".spec "file" binaries " переменная, но это будет работать только для вашей текущей программы. Если вы хотите, чтобы он работал для всех программ, которые вы замораживаете, вы должны сделать "крюк" и сохранить его в C:\Python3 * \Lib\site-packages\PyInstaller\hooks.
мне пришлось адаптировать код Леонидра, чтобы сделать numpy-hook рабочий. Я переписал его, используя более современный, питонический подход, используя понимание списка:
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 ' есть.
Я только что столкнулся с той же проблемой. В качестве обходного пути я скопировал DLL вручную, как описано вhttps://stackoverflow.com/a/34893933/4089081
Я пытаюсь найти лучшее решение, хотя.
Я просто обновляю numpy + mkl до последней версии, вы можете скачать numpy + mkl из здесь
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 в onefile. Обратите внимание, что мое конкретное приложение использует matplotlib, и проблема, которую я испытывал, была каждый раз, когда я нажмите кнопку (tkinter), чтобы выполнить сюжет, приложение разбилось.
шаги
первый: создайте свое приложение, используя:
pyinstaller --onefile --windowed yourpythonappnamehere.py
второй открыть .spec
file и добавьте это к нему. Очевидно, убедитесь, что приведенные ниже файлы действительно существуют в первую очередь. Возможно, вы не ... --7--> так что просто дружеское предупреждение не копировать вслепую.
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
папка и запустите приложение. Надеюсь, это сработает!
обновление: если вы получаете Intel MKL фатальная ошибка: не удается загрузить mkl_intel_thread.dll файлы но вы можете ясно видеть, что mkl_intel_thread.dll находится в каталоге вашей программы, перейдите в numpy / core и буквально скопируйте все файлы.расширения dll, которые вы не имейте и вставьте их в каталог вашей программы и повторно запустите. Если это работает, отлично, но вы можете удалить по одному за раз, чтобы выяснить, какие из них вам нужны, а какие нет.
я обновил фрагмент, чтобы он работал с моей установкой 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. Я также видел, что есть PR на github с более точным исправлением. Смотрите это фиксация
У меня было установлено 2 версии Python. Одна базовая версия Python и одна установленная Anaconda. При запуске моего сценария машинного обучения он вызвал ту же ошибку. Когда я удалил одну из двух версий (в моем случае я удалил Анаконда) все снова работает нормально. Я использую deeplearning4j в качестве библиотеки, и, по-видимому, у него есть трудности с решением этой dll, потому что было установлено несколько установок Python.