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

enter image description here

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?

11
demandé sur Mogsdad 2017-09-26 03:51:09

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:

  1. créer" un " fichier unique qui inclut tous les fichiers dll, pyd et plus... un grand exe-file comme résultat.
  2. 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(...)

3
répondu ZF007 2018-02-14 22:26:55

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

1
répondu altendky 2017-09-26 14:11:06

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.

1
répondu BuvinJ 2018-02-14 23:37:27