2016-02-18 14 views
6

Ich bin neu mit Python-Anwendungen. 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.Pyinstaller numpy "Intel MKL FATAL FEHLER: Kann nicht mkl_intel_thread.dll"

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 meine app mit der exe-Datei im dist Verzeichnis von pyinstaller erstellt starten und es scheint, bis zum Programmaufruf numpy und Crash mit diesem Fehler funktionieren:

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

die mkl_intel_thread.dll nicht im Software-Verzeichnis ist; aber mit der Datei im Stammverzeichnis des Programms kopiert habe ich den gleichen Fehler

Danke für Ihre Hilfe

Antwort

0

Ich habe ein hook-numpy.py mit diesem Problem fertig zu werden: beschleunigen numpy und scipy

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 conda die mkl Bibliotheken installiert.

+0

Danke. Dein Fix hat mein Problem gelöst. Aber jetzt merkte ich, dass wenn meine App Anruf Funktion in Bezug auf pyqtgraph es mit dem gleichen Fehler abstürzt: Intel MKL FATAL FEHLER: Kann nicht laden mkl_intel_thread.dll –

+0

Ist dies eine andere App? es stürzt mit dem gleichen Fehler ab? – LeonidR

+0

Nein, die gleiche App enthält auch pyqtgraph. Wenn ich jetzt die exe ausführe, die von pyinstaller generiert wurde, läuft es gut, bis eine Funktion, die pyqtgraph verwendet, aufgerufen wird, nachdem sie mit dem Intel MKL FATAL ERROR abstürzt. Vor der Behebung des Problems tritt der Absturz auf. Erlier –

7

Ich hatte das gleiche Problem mit Pyinstaller und Numpy. Standardmäßig scheint pyinstaller numpy Binaries nicht zu berücksichtigen, so dass Sie es manuell angeben müssen. Sie können die Dateien hinzufügen, die die Datei ".spec" bearbeiten, aber das funktioniert nur für Ihr aktuelles Programm. Wenn du willst, dass es für alle Programme funktioniert, die du einfrierst, solltest du einen "Haken" machen und es in C: \ Python3 * \ Lib \ site-packages \ PyInstaller \ hooks speichern.

Ich musste den LeonidR-Code anpassen, damit der Nummy-Hook funktioniert. Ich rewrited es mit einem moderneren, pythonic Ansatz Listenkomprehensionen mit:

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. Der zweite Eintrag des Tupels entspricht dem Ordner, in den Sie die 'dlls' einfügen möchten. In diesem Fall ist es leer, also kopiert es sie direkt in den Hauptordner, in dem sich '.exe' befindet.

+2

Können Sie es bitte ausarbeiten? Ich stehe vor dem gleichen Problem, aber ich verstehe das nicht, wenn ich haken.py, und speichern Sie es in C: \ Python3 * \ Lib \ Site-Pakete \ PyInstaller \ hooks Wie werde ich es in meinem Code aufrufen, so dass es auch die Datei liest? – muazfaiz

+0

Das funktionierte fast für mich, aber wie andere bemerkten, dass libiomp5md.dll auch benötigt wird, modifizierte ich die letzte Zeile zu: binaries = [(mkldir + "/" + mkl, '') für mkl in listdir (mkldir) wenn mkl. startswith ('mkl_') oder mkl.startswith ('libio')] – Raj

0

j4n7 's Antwort war sehr hilfreich, aber es kann oder darf nicht fehlerhaft sein. compat.base_prefix verwendet Backslashes (zumindest für mich), aber sie verketten sich dann mit "/Lib/site-packages/numpy/core" (Schrä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 können, erzeugt es sowohl Vorwärts- als auch Rückwärtsstriche in einem Pfad.

Hier sind meine Schritte, die mir erlaubt, die numpy MKL-Dateien in Onefile zu bündeln. Beachten Sie, dass meine spezielle Anwendung matplotlib verwendet und das Problem, das ich hatte, war jedes Mal, wenn ich auf eine Schaltfläche (tkinter) klickte, um die Handlung auszuführen, stürzte die App ab.

Schritte

Erste: einen Build Ihrer Anwendung unter Verwendung der:

pyinstaller --onefile --windowed yourpythonappnamehere.py 

Zweite: Öffnen Sie die .spec Datei und fügen diese zu. Stellen Sie sicher, dass die folgenden Dateien tatsächlich zuerst existieren. Sie können nicht Python34 so nur eine freundliche Warnung, 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', '')] 

Dritte: wo es heißt binaries=None, Änderung binaries=mkl_dlls.

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

Vierte: Re-run den ersten Schritt. Wenn deine App erstellt wurde, gehe in den Ordner dist und starte deine App. Ich hoffe es funktioniert für dich!

UPDATE: Wenn Sie Intel MKL FATAL ERROR erhalten: Kann nicht mkl_intel_thread.dll laden aber Sie können das mkl_intel_thread.dll ist in Ihrem Programmverzeichnis klar sehen, gehen Sie zu numpy/Kern und buchstäblich kopieren Sie alle Dateien mit .dll-Erweiterungen, die Sie nicht haben, und fügen Sie sie in das Programmverzeichnis ein und führen Sie sie erneut aus. Wenn es funktioniert, großartig, aber Sie möchten vielleicht eins nach dem anderen löschen, um herauszufinden, welche Sie brauchen und welche nicht.

0

ich das Snippet aktualisiert, um es mit meiner anaconda Installation zu bekommen arbeiten (der Weg ist unterschiedlich):

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

aktualisieren: Dies funktioniert nur für Windows. Ich habe auch gesehen, dass es eine PR auf Github mit einer genaueren Lösung gibt. Siehe dieses Commit

0

Ich hatte 2 Versionen von Python installiert. Eine Basisversion von Python und eine von Anaconda installierte Version. Beim Ausführen meines Machine Learning-Skripts wurde derselbe Fehler ausgegeben. Wenn ich eine der beiden Versionen deinstalliert habe (in meinem Fall habe ich Anaconda entfernt), funktioniert alles wieder gut. Ich benutze deeplearning4j als Bibliothek und anscheinend hat es Schwierigkeiten, diese DLL aufzulösen, weil dort mehrere Python-Installationen installiert waren.