webentwicklung-frage-antwort-db.com.de

Pyinstaller numpy "Intel MKL FATAL ERROR: mkl_intel_thread.dll kann nicht geladen werden"

Ich bin neu mit Python-Apps. Ich versuche, meine Python-GUI-App mit pyinstaller .. zu erstellen. Meine App hängt von den folgenden Paketen ab: PyQt4, numpy, pyqtgraph, h5py .. __ Ich arbeite mit WinPython-32bit-3.4.4.1.

Ich baue die App mit diesem Befehl:

pyinstaller --hidden-import=h5py.defs --hidden-import=h5py.utils --hidden-import=h5py.h5ac --hidden-import=h5py._proxy VOGE.py

Ich starte meine App mit der exe-Datei in dem von pyinstaller erstellten Verzeichnis dist und es scheint gut zu funktionieren, bis das Programm numpy aufruft und mit diesem Fehler abstürzt:

Intel MKL FATAL ERROR: mkl_intel_thread.dll kann nicht geladen werden

Die mkl_intel_thread.dll ist nicht im Softwareverzeichnis vorhanden. aber wenn die Datei in das Stammverzeichnis des Programms kopiert wurde, erhielt ich den gleichen Fehler

Danke für Ihre Hilfe

9
f_ciriolo

Ich habe einen hook-numpy.py erstellt, um dieses Problem zu lösen:

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)

In meinem Fall installiert conda die mkl-Bibliotheken, um numpy und scipy zu beschleunigen.

1
LeonidR

Ich hatte das gleiche Problem mit Pyinstaller und Numpy. Standardmäßig scheint pyinstaller numpy-Binärdateien nicht zu berücksichtigen, so dass Sie es manuell angeben müssen. Sie können die Dateien hinzufügen, die die ".spec" -Dateivariable "binaries" bearbeiten, dies funktioniert jedoch nur für Ihr aktuelles Programm. Wenn Sie möchten, dass für alle Programme, die Sie einfrieren, funktioniert, sollten Sie einen "Haken" erstellen und ihn unter C:\Python3 *\Lib\site-packages\PyInstaller\hooks speichern.

Ich musste den Code von LeonidR anpassen, damit der Numpy-Hook funktioniert. Ich habe es mit einem moderneren, Pythonic-Ansatz mit Listenverstehen neu geschrieben:

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_')] 

"Binaries" ist eine Liste von Tupeln. Das zweite Element des Tupels entspricht dem Ordner, in dem Sie die 'dlls' ablegen möchten. In diesem Fall ist sie leer, sodass sie direkt in den Hauptordner kopiert werden, in dem sich die '.exe' befindet.

7
j4n7

Ich bin gerade auf das gleiche Problem gestoßen. Als Workaround habe ich die DLLs manuell kopiert, wie in https://stackoverflow.com/a/34893933/4089081 beschrieben.

Ich versuche jedoch eine bessere Lösung zu finden.

2
durox

Ich aktualisiere numpy + mkl auf die neueste Version. Sie können numpy + mkl von hier herunterladen

1
Hailin FU

Die Antwort von j4n7 war sehr hilfreich, kann jedoch fehlerhaft sein. compat.base_prefix verwendet Backslashes (zumindest für mich), verkettet sie jedoch mit "/Lib/site-packages/numpy/core" (Vorwärtsschrägstriche).

>>> 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'

Wie Sie sehen, werden in einem Pfad sowohl vorwärts als auch rückwärts Schrägstriche erzeugt.

Hier sind meine Schritte, die es mir ermöglichten, die numpy-mkl-Dateien in eine Datei zu bündeln. Beachten Sie, dass meine spezielle App matplotlib verwendet und das Problem, das bei mir aufgetreten ist, jedes Mal war, wenn ich auf eine Schaltfläche (tkinter) geklickt habe, um die Zeichnung auszuführen, die App abgestürzt ist.

Schritte

Zuerst : Erstellen Sie eine App mit:

pyinstaller --onefile --windowed yourpythonappnamehere.py

Second : Öffnen Sie die .spec-Datei und fügen Sie diese hinzu. Vergewissern Sie sich natürlich, dass die folgenden Dateien zuerst vorhanden sind. Sie können Python34 nicht so einfach eine freundliche Warnung haben, nicht blind zu kopieren.

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', '')]

Drittens : Wenn dort binaries=None steht, ändern Sie in binaries=mkl_dlls.

a = Analysis(['yourpythonappnamehere.py'],
             pathex=['C:\\Users\\...\\Documents\\...'],
             binaries=mkl_dlls,
             datas=None,
             ....

Vierter : Führen Sie den ersten Schritt erneut aus. Wenn Ihre App erstellt ist, wechseln Sie in den Ordner dist und starten Sie Ihre App. Ich hoffe es klappt für dich!

UPDATE: Wenn Sie Intel MKL FATAL ERROR erhalten: Kann mkl_intel_thread.dll nicht laden, aber Sie können deutlich sehen, dass die Datei mkl_intel_thread.dll IS in Ihrem Programmverzeichnis zu numpy/core und erscheint Kopieren Sie buchstäblich alle Dateien mit der Erweiterung .dll, die Sie nicht haben, und fügen Sie sie in das Verzeichnis Ihres Programms ein, und führen Sie sie erneut aus. Wenn es funktioniert, ist es großartig, aber Sie möchten vielleicht nacheinander löschen, um herauszufinden, welche Sie benötigen und welche nicht.

0
Jarad

Ich hatte 2 Versionen von Python installiert. Eine Basisversion von Python und eine von Anaconda installierte. Beim Ausführen meines maschinellen Lernskripts wurde derselbe Fehler ausgegeben. Wenn ich eine der beiden Versionen deinstalliert habe (in meinem Fall habe ich Anaconda entfernt), funktioniert alles wieder einwandfrei. Ich benutze deeplearning4j als Bibliothek und anscheinend hat es Schwierigkeiten, diese DLL zu lösen, da mehrere Python-Installationen installiert waren.

0
Bart Van Miegem

Ich habe das Snippet aktualisiert, damit es mit meiner Anaconda-Installation funktioniert (der Pfad ist anders):

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_')]

Update: Dies funktioniert nur für Windows. Ich habe auch gesehen, dass es auf github eine PR mit einer genaueren Korrektur gibt. Siehe dieses Commit

0
maggie