Не удается загрузить mkl_intel_thread.dll на исполняемый файл Python
Я пытаюсь создать исполняемую программу Python, которая запускается в Windows без установки Python, для этого я использую cx_Freeze. Но я получаю следующую ошибку: "Не удается загрузить mkl_intel_thread.dll"
На моем ПК, на котором установлен python (miniconda3), я собрал исполняемый файл с помощью cx_Freeze, и когда я запускал исполняемый файл, я также получал "Cannot load mkl_intel_thread.dll". Я исправил это, перейдя в папку python, Library\bin, и скопировал файл mkl_intel_thread.dll туда, где находится исполняемый файл. Проблема заключается в том, что при перемещении всей папки на другой компьютер (без установленного python) эта ошибка появляется снова, даже если mkl_intel_thread.dll находится в папке.
Файл, который я хочу распространить (plot.py):
import matplotlib.pyplot as plt
a = [0, 1, 2]
b = [0, 2, 0]
plt.fill(a, b, 'b')
plt.show()
Установочный файл cx_Freeze (setup.py):
import cx_Freeze
import sys
import matplotlib
import numpy
import os
os.environ['TCL_LIBRARY'] = "C:\\Miniconda3\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\Miniconda3\\tcl\\tk8.6"
executables = [cx_Freeze.Executable("plot.py")]
build_exe_options = {"includes":['numpy.core._methods',
'numpy.lib.format', 'matplotlib.backends.backend_tkagg']}
cx_Freeze.setup(
name = "script",
options = {"build_exe": build_exe_options},
version = "0.0",
description = "A basic example",
executables = executables)
4 ответа
РЕДАКТИРОВАТЬ:
Попробуйте скопировать все файлы, начиная с
mkl
вы найдете подLibrary\bin
или жеnumpy\core
в папку сборки, а такжеlibiomp5md.dll
см. Python Pyinstaller 3.1 Intel MKL FATAL ERROR: Не удается загрузить mkl_intel_thread.dll и cx_freeze аварийно завершает работу GUI-приложения (tkinter) после нажатия кнопки plot.Как только вы выяснили, какие файлы нужно копировать вручную, вы можете
cx_Freeze
включите необходимые файлы, используяinclude_files
списокbuild_exe
варианты (см. фрагмент кода ниже). При необходимости вы можете использовать кортеж(source, destination)
как элемент вinclude_files
список, чтобы позволитьcx_Freeze
скопировать файл изsource
к конкретномуdestination
в каталог сборки, см.cx_Freeze
документацияЯ вижу дальнейшие потенциальные проблемы в сценарии установки, который вы разместили в своем вопросе:
- включать в себя весь
numpy
пакеты с использованиемpackages
списокbuild_exe
варианты, это проще и может быть безопаснее - безопаснее динамически определять расположение DLL-библиотек TCL/TK
- за
cx_Freeze
5.1.1, библиотеки TCL/TK должны быть включены вlib
подкаталог каталога сборки
- включать в себя весь
В итоге, попробуйте использовать
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
build_exe_options = {'packages': ['numpy'],
'includes': ['matplotlib.backends.backend_tkagg'],
'include_files': [(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
os.path.join('lib', 'tcl86t.dll')),
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join('lib', 'tk86t.dll'))
# add here further files which need to be included as described in 1.
]}
в вашем скрипте установки.
Аналогичная проблема затрагивает cx_Freeze 6.1 или 6.2: исполняемый файл не запускается либо без сообщения об ошибке, либо с
ОШИБКА INTEL MKL: указанный модуль не найден. mkl_intel_thread.dll.
Неустранимая ошибка Intel MKL: не удается загрузить mkl_intel_thread.dll.
Конфигурация:
- Windows 10
- Python 3.8.5 установлен с https://www.python.org/
- numpy 1.19.1+mkl, установленный с помощью pip с помощью колеса https://www.lfd.uci.edu/~gohlke/pythonlibs/
- различные модули python, установленные с помощью pip
Это также наблюдается с Python 3.6.8 или более ранними версиями numpy, например, 1.18.4+mkl или 1.19.0+mkl.
Я заметил, что cx_Freeze включает 3 библиотеки DLL mkl_rt.dll
, python38.dll
, а также vcruntime140.dll
в подкаталоге lib\numpy\core
каталога сборки, тогда как исходная установка не содержит DLL в подкаталоге site-packages\numpy\core
(все библиотеки DLL находятся в site-packages\numpy\DLLs
). Если я удалю вручнуюmkl_rt.dll
из подкаталога lib\numpy\core
каталога сборки после сборки приложения с помощью cx_Freeze проблема исчезает, и приложение работает.
Это решение можно реализовать, добавив следующий код в конец setup.py
сценарий:
numpy_core_dir = os.path.join(dist_dir, 'lib', 'numpy', 'core')
for file_name in os.listdir(numpy_core_dir):
if file_name.lower().endswith('.dll'):
file_path = os.path.join(numpy_core_dir, file_name)
os.remove(file_path)
где dist_dir
каталог сборки, созданный cx_Freeze (переданный в build_exe
вариант).
Попробуйте найти решение этой проблемы, понизив numpy == 1.18.2 с numpy == 1.19.1 при использовании cx_Freeze==6.5.3.
Просто скопируйте эти четыре файла в cx_freeze
созданная папка сборки
mkl_core.dll
mkl_def.dll
mkl_intel_thread.dll
mkl_mc3.dll