web-dev-qa-db-ja.com

Windows10からWindows <10にopencvを配布するPyinstaller、ucrtdllがないapi-ms-win-crt

OpenCVを使用するPython 3.5 64ビットプログラム(Windowsのテンソルフローに必要))があります。pyinstallerで配布しています。

Windows10でプログラムをビルドしました

/c/Python35/Scripts/pyinstaller -c DeepMeerkat.spec

私のコンピューターでは、.exeがビルドされ、完全に実行されます。その他のWindows10以外のマシン

オン

import cv2

戻り値

ImportError:DLLロードに失敗しました:指定されたモジュールが見つかりませんでした。

pyInstaller thread でこれに関する膨大な量の議論を見ることができますが、それをどのように実践するかはよくわかりません。 Dependency Walkerは、DLLがいくつか不足していると言っています

api-ms-win-crt-**.dll

さて、pyInstallerスレッドから、これらのDLLが存在することがわかります

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs

アーキテクチャに基づく複数のサブフォルダの下。

.specファイルに追加してみました

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/"],

または私の特定のアーキテクチャの場合

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm"],

これが私が提案されていると思ったものです ここ

「Windows10用のWindowsソフトウェア開発キット(SDK)をインストールし、.specファイルを展開して必要なDLLを含めます。上記のリンクの番号6の「ユニバーサルCRTを使用するソフトウェアの配布」を参照してください。

それは何の効果もありませんでした。私は次のような何百ものエラーが発生しています

121472 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of c:\python35\DLLs\_ssl.pyd

しかし、ここでDLL

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\arm

enter image description here

だから私は文字通りフォルダ全体をポストホックにコピーしました

cp -r "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/" dist/Lib/

しかし、これらを.exeに接続する方法は明確ではありません。明らかに、事前にpyInstallerに通知することをお勧めします。

私も試しました

/c/Python35/Scripts/pyinstaller --path "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm" -c DeepMeerkat.spec

そしてそれはまだそれらを見つけられませんでした

また、そのフォルダーをPATHに追加してみました。何か案は?

11
bw4sz

スペックファイルを提供していただければ、何が起こっているのかがわかります。ここから、ファイルが含まれていない可能性があります。

ここから進むには2つの方法があります。

  1. すべてのdll、pydファイルなどを含む「1つの」単一ファイルを作成します...結果として大きなexeファイル。
  2. もう1つの方法は、ファイル+フォルダーをdllファイルなどで埋めることです。小さなexeファイルを取得します。

チェック ここにバイナリ(dllを含む)ファイルを追加 ファイルを手動で含めることに関するpyinstallerのドキュメント。

チェック ここにデータファイルを追加 ファイルを手動で含めることに関するpyinstallerのドキュメント。

Dllフォルダーのdllファイルを含むスペックファイルの例。

block_cipher = None a = Analysis(['minimal.py'], pathex = ['/Developer/PItests/minimal'], binaries = [ ( 'C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs', '.' ) ], datas = [ ('helpmod/help_data.txt', 'helpmod' ) ], hiddenimports = [], hookspath = None, runtime_hooks = None, excludes = None, cipher = block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher = block_cipher) exe = EXE(pyz,... ) coll = COLLECT(...)

3
ZF007

PyInstallerとPy2exeがdllのピックアップに何度も失敗するのを見てきました。個人的に、私はそれらの使用をバッチまたはbashでラップして、それらの機能を拡張するいくつかの理由があります。論理的には、それらをpyスクリプト自体でラップするための引数があります...

とにかく、これと戦うよりも、ラッパースクリプトを使用して依存関係をインストールパッケージにコピーする方が簡単な場合があります。

通常、不足しているものを実行しようとすると、dllが不足しているというエラーがスローされます。それぞれを手動でディレクトリに追加し、自分で含める必要があるものをメモします。次に、それをスクリプト化します。

1
BuvinJ

私はこれを自分で行う必要がありますが、まだ行っていません。私がそうするとき、私は私の完全な解決策を投稿しようとします。その間...

検索パスを拡張するだけでなく、明示的に含めるように要求する必要があると思います。

https://pythonhosted.org/PyInstaller/spec-files.html#adding-binary-files

おそらく、彼らが言及しているTreeクラスを使用して、すべてのファイルを収集します。

https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class

1
altendky