私はpython appsを使用しています。pyinstallerを使用してpython GUIアプリを作成しようとしています。アプリは次のパッケージに依存しています:PyQt4、numpy 、pyqtgraph、h5py WinPython-32bit-3.4.4.1を使用しています。
私はこのコマンドでアプリをビルドします:
pyinstaller --hidden-import=h5py.defs --hidden-import=h5py.utils --hidden-import=h5py.h5ac --hidden-import=h5py._proxy VOGE.py
私はpyinstallerによって作成されたdistディレクトリにあるexeファイルを使用してアプリを起動し、プログラムがnumpyを呼び出してこのエラーでクラッシュするまで問題なく動作するようです:
インテルMKLの致命的なエラー:mkl_intel_thread.dllを読み込めません
Mkl_intel_thread.dllはソフトウェアディレクトリにありません。しかし、ファイルをプログラムのルートディレクトリにコピーすると、同じエラーが発生しました
ご協力いただきありがとうございます
この問題に対処するためにhook-numpy.py
を作成しました。
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)
私の場合、conda
はnumpy
とscipy
を高速化するためにmklライブラリをインストールしています。
PyinstallerとNumpyを使用して同じ問題が発生しました。デフォルトでは、pyinstallerはnumpyバイナリを考慮していないようなので、手動で指定する必要があります。 「.spec」ファイルの「binaries」変数を編集してファイルを追加できますが、これは現在のプログラムでのみ機能します。すべてのプログラムで機能させる場合は、フリーズして「フック」を作成し、C:\ Python3 *\Lib\site-packages\PyInstaller\hooksに保存します。
Numpy-hookを機能させるには、LeonidRのコードを調整する必要がありました。私は、リスト内包表記を使用したより近代的なPythonのアプローチを使用して書き直しました。
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_')]
「バイナリ」はタプルのリストです。タプルの2番目の項目は、「dll」を配置するフォルダーに対応しています。この場合は空なので、「。exe」があるメインフォルダーに直接コピーします。
私は同じ問題に出くわしました。 https://stackoverflow.com/a/34893933/4089081 で説明されているように、回避策として、DLLを手動でコピーしました
しかし、私はより良い解決策を見つけようとしています。
Numpy + mklを最新バージョンに更新するだけです。numpy+ mklは here からダウンロードできます。
j4n7の回答は非常に役に立ちましたが、バグがある場合とそうでない場合があります。 compat.base_prefix
は(少なくとも私にとっては)バックスラッシュを使用しますが、それらは"/Lib/site-packages/numpy/core"
(スラッシュ)と連結します。
>>> 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'
ご覧のとおり、パスにスラッシュとバックスラッシュの両方が生成されます。
Numpy mklファイルを1つのファイルにバンドルできるようにするための手順は次のとおりです。私の特定のアプリはmatplotlibを使用しており、プロットを実行するためにボタン(tkinter)をクリックするたびにアプリがクラッシュするという問題が発生したことに注意してください。
手順
First:次を使用してアプリのビルドを作成します。
pyinstaller --onefile --windowed yourpythonappnamehere.py
2番目:.spec
ファイルを開き、これに追加します。以下のファイルが実際に最初に存在することを確認してください。あなたはPython34
を持っていないかもしれませんので、盲目的にコピーしないように単に友好的な警告をしてください。
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', '')]
番目:binaries=None
とあるところをbinaries=mkl_dlls
に変更します。
a = Analysis(['yourpythonappnamehere.py'],
pathex=['C:\\Users\\...\\Documents\\...'],
binaries=mkl_dlls,
datas=None,
....
4番目:最初ステップを再実行します。アプリがビルドされたら、dist
フォルダーに移動してアプリを起動します。うまくいくことを願っています!
[〜#〜] update [〜#〜]:取得した場合インテルMKL致命的なエラー:mkl_intel_thread.dllをロードできませんしかし、mkl_intel_thread.dll ISプログラムディレクトリにあるnumpy/coreに移動し、.dll拡張子のないすべてのファイルを文字通りコピーして、プログラムのディレクトリを確認して再実行します。問題なく動作する場合は、一度に1つずつ削除して、必要なものと不要なものを区別することをお勧めします。
Pythonの2つのバージョンをインストールしました。Pythonの1つの基本バージョンとAnacondaによってインストールされたバージョンの1つです。私の機械学習スクリプトを実行すると、同じエラーが発生しました。 2つのバージョンの1つをアンインストールしました(私の場合はAnacondaを削除しました)。すべてが正常に機能します。deeplearning4jをライブラリとして使用しているため、このdllを解決するのが難しいようです。Pythonインストールが複数あったためですインストールされています。
スニペットを更新して、anacondaインストールで機能するようにしました(パスは異なります)。
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:これはWindowsでのみ機能します。また、githubにはより正確な修正を含むPRがあることも確認しました。これを見てください コミット