7
votes

Impossible de charger mkl_intel_thread.dll sur l'exécutable python

J'essaie de créer un programme python exécutable qui s'exécute sur Windows sans que python soit installé, pour cela j'utilise cx_Freeze. Mais j'obtiens l'erreur suivante: "Impossible de charger mkl_intel_thread.dll"

Sur mon PC, sur lequel python est installé (miniconda3), j'ai construit l'exécutable en utilisant cx_Freeze, et quand j'ai exécuté l'exécutable, j'obtiendrais également "Impossible de charger mkl_intel_thread .dll ". J'ai corrigé cela en accédant à mon dossier python, Library \ bin, et en copiant le fichier mkl_intel_thread.dll dans l'emplacement de l'exécutable. Le problème est que, lors du déplacement du dossier entier vers un autre PC (sans python installé), cette erreur réapparaît, même si mkl_intel_thread.dll se trouve dans le dossier.

Fichier que je veux distribuer (plot.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)

Fichier de configuration cx_Freeze (setup.py):

import matplotlib.pyplot as plt

a = [0, 1, 2]
b = [0, 2, 0]
plt.fill(a, b, 'b')
plt.show()


2 commentaires

Quelle version de cx_Freeze utilisez-vous?


@jpeg La dernière version sur anaconda.org, 5.1.1


3 Réponses :


7
votes

MODIFIER:

  1. Essayez de copier tous les fichiers commençant par mkl que vous trouvez sous Library \ bin ou numpy \ core dans le dossier de construction, ainsi que libiomp5md.dll , voir Python Pyinstaller 3.1 Intel MKL FATAL ERROR: Impossible de charger mkl_intel_thread.dll a> et cx_freeze converti GUI-app (tkinter) se bloque après avoir appuyé sur le bouton plot .

    Une fois que vous avez identifié le (s) fichier (s) à copier manuellement, vous pouvez laisser cx_Freeze inclure le (s) fichier (s) nécessaire (s) en utilisant le code include_files > liste des options build_exe (voir l'extrait de code ci-dessous). Si nécessaire, vous pouvez utiliser un tuple (source, destination) comme élément dans la liste include_files pour permettre à cx_Freeze de copier un fichier depuis source vers une destination spécifique dans le répertoire de construction, voir le cx_Freeze documentation .

  2. Je vois d'autres problèmes potentiels dans le script de configuration que vous avez publié dans votre question:

    • inclure l'ensemble des packages numpy en utilisant la liste packages des options build_exe , c'est plus facile et peut-être plus sûr
    • il est plus sûr de trouver dynamiquement l'emplacement des DLL TCL / TK
    • pour cx_Freeze 5.1.1, les DLL TCL / TK doivent être incluses dans un sous-répertoire lib du répertoire de construction

En résumé, essayez d'utiliser

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.
                                      ]}

dans votre script de configuration.


3 commentaires

sur mon PC, cela me donnera toujours "Intel MKL FATAL ERROR: Impossible de charger mkl_intel_thread.dll.". Mais encore une fois, je peux copier la dll dans le dossier et cela fonctionnera.Je vais transférer sur l'autre PC plus tard, mais je soupçonne que cela donnera la même erreur.


Essayez de copier tous les fichiers commençant par mkl que vous trouvez sous Library \ bin ou numpy \ core dans le dossier de construction, ainsi que libiomp5md.dll , voir ce message et ce message .


@Carlos Ça a l'air génial. J'ai modifié ma réponse en conséquence.



0
votes

Copiez simplement ces quatre fichiers dans le dossier de construction généré par cx_freeze

mkl_core.dll
mkl_def.dll
mkl_intel_thread.dll
mkl_mc3.dll


2 commentaires

Bien que cela puisse résoudre le problème, tt serait bon si des détails supplémentaires sont fournis.


Dans mon cas, la suppression de lib / numpy / core / mkl_rt.dll a résolu le problème.



1
votes

Un problème similaire affecte cx_Freeze 6.1 ou 6.2: l'exécutable ne se lance pas, soit sans message d'erreur, soit avec

INTEL MKL ERROR: Le module spécifié est introuvable. mkl_intel_thread.dll.
Intel MKL FATAL ERROR: impossible de charger mkl_intel_thread.dll.

Configuration:

Ceci est également observé avec Python 3.6.8 ou des versions antérieures de numpy telles que par exemple 1.18.4 + mkl ou 1.19.0 + mkl.

J'ai observé que cx_Freeze inclut 3 DLL mkl_rt.dll , python38.dll , et vcruntime140.dll dans le sous-répertoire lib \ numpy \ core du répertoire de construction, alors que l'installation d'origine ne contient aucune DLL dans le sous-répertoire site-packages \ numpy \ core (toutes les DLL sont dans site-packages \ numpy \ DLL ). Si je supprime manuellement mkl_rt.dll du sous-répertoire lib \ numpy \ core du répertoire de construction après avoir créé l'application avec cx_Freeze, le problème disparaît et l'application fonctionne. p>

Cette solution peut être implémentée en ajoutant le code suivant à la fin du script 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 est le répertoire de construction généré par cx_Freeze (passé à l'option build_exe ).


0 commentaires