Pyinstaller distribuant opencv de Windows 10 à Windows
j'ai un programme Python 3.5 64 bits (requis par tensorflow pour Windows) qui utilise OpenCV. Je le distribue avec pyinstaller.
j'ai construit mon programme avec Windows 10
/c/Python35/Scripts/pyinstaller -c DeepMeerkat.spec
Sur mon ordinateur, le .exe construit et fonctionne parfaitement. Sur toute autre machine autre que Windows 10
import cv2
Retourne
ImportError: la charge DLL a échoué: le module spécifié ne pouvait pas être trouver.
je peux voir une énorme quantité de la discussion sur ce sur fil pyInstaller, mais je ne peux pas vraiment dire comment le mettre en pratique. Dépendance walker dit qu'il me manque un certain nombre de DLLs
api-ms-win-crt-**.dll
Ok, à partir de la pyInstaller fils, je sais que ces Dll existe pas
C:Program Files (x86)Windows KitsRedistucrtDLLs
sous plusieurs sous-dossiers basés sur l'architecture.
j'ai essayé d'ajouter mon .le fichier de spécification
pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/"],
Ou pour mon particulier architecture
pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm"],
ce qui est ce que je pensais était suggéré ici
"Installer Windows Kit de Développement Logiciel (SDK) de Windows 10 et développez le .spec-fichier à inclure les Dll requises, voir "Distribution de Logiciel qui utilise le CRT universel" dans le lien mentionné ci-dessus, le numéro 6."
Qui n'a eu aucun effet. Je reçois des centaines d'erreurs comme
121472 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of c:python35DLLs_ssl.pyd
Mais I peut voir que DLL ici
C:Program Files (x86)Windows KitsRedistucrtDLLsarm
alors j'ai littéralement copié posthoc tout le dossier
cp -r "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/" dist/Lib/
mais il n'est pas clair comment les relier à la .exe
. De toute évidence, il est préférable d'informer pyInstaller à l'avance.
j'ai aussi essayé
/c/Python35/Scripts/pyinstaller --path "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm" -c DeepMeerkat.spec
Et il n'a toujours pas trouver
j'ai aussi essayé d'ajouter ce dossier au chemin. Des idées?
3 réponses
si vous aviez fourni votre fichier, je verrais ce qui se passe. D'ici, il est probable que vous n'incluez pas les fichiers.
il y a deux méthodes pour partir d'ici:
- créer" un " fichier unique qui inclut tous les fichiers dll, pyd et plus... un grand exe-file comme résultat.
- l'autre façon est de l'avoir comme dossier + dossier rempli de fichiers dll,etc... tu as un petit fichier d'exe.
Case ajouter binaire (incl. fichiers dll) ici la documentation pyinstaller sur l'inclusion manuelle des fichiers.
Case ajouter des fichiers de données ici la documentation pyinstaller sur l'inclusion manuelle des fichiers.
un exemple de fichier spec qui inclut les fichiers dll de votre dossier dll.
block_cipher = None
a = Analysis(['minimal.py'],
pathex = ['/Developer/PItests/minimal'],
binaries = [ ( 'C:\Program Files (x86)\Windows Kits\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(...)
je dois le faire moi-même mais je ne l'ai pas encore fait. J'essaierai de poster ma solution complète quand je le ferai. Dans le temps moyen...
je pense que vous pourriez avoir à demander explicitement-ils être inclus au lieu de simplement élargir le chemin de recherche.
https://pythonhosted.org/PyInstaller/spec-files.html#adding-binary-files
probablement en utilisant le Tree
classe ils mentionnent à recueillir tous les fichiers pour vous.
https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class
J'ai vu PyInstaller et Py2exe manquer de capter dlls d'innombrables fois. Personnellement, j'enveloppe mes utilisations dans le lot ou bash pour un certain nombre de raisons pour prolonger ce qu'ils font. Logiquement, je vois un argument pour les envelopper dans des scripts eux-mêmes...
quoi qu'il en soit, il peut être plus facile de simplement copier les dépendances dans votre paquet d'installation à travers un script de wrapper plutôt que de se battre avec cela.
typiquement, vous obtiendrez une dll manquante erreur lancée sur vous quand essayer pour lancer quelque chose qu'il manque. Ajoutez chacune manuellement dans le répertoire, en notant ce que vous aviez besoin d'inclure vous-même. Ensuite script.