Не удается загрузить 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 ответа

Решение

РЕДАКТИРОВАТЬ:

  1. Попробуйте скопировать все файлы, начиная с 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 документация

  2. Я вижу дальнейшие потенциальные проблемы в сценарии установки, который вы разместили в своем вопросе:

    • включать в себя весь 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.

Конфигурация:

Это также наблюдается с 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
Другие вопросы по тегам