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.