2017-09-30 1 views
1

Après la construction d'un exe pour mon script python dungeon.py, j'obtiens une erreur lorsque PyBearLibTerminal.py (un script mon programme importe) essaie de charger une DLL BearLibTerminal.dll. Le script s'exécute correctement, il exécute uniquement l'exécutable qui provoque l'erreur. L'erreur est signalée lors de l'exécution de l'exécutable estPyinstaller pas de chargement DLL

[3464] Failed to execute script dungeon 
Traceback (most recent call last): 
    File "dungeon.py", line 2, in <module> 
    File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked 
    File "<frozen importlib._bootstrap>", line 1129, in _exec 
    File "C:\Program Files\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module 
    exec(bytecode, module.__dict__) 
    File "PyBearLibTerminal.py", line 50, in <module> 
RuntimeError: BearLibTerminal library cannot be loaded. 

Ceci est le début du fichier PyBearLibTerminal.py où l'erreur est due.

import sys, ctypes, numbers, os 

_version3 = sys.version_info >= (3, 0) 

_library = None 
_possible_library_names = [ 
    'BearLibTerminal.dll',  # Generic Windows DLL 
    './libBearLibTerminal.so', # Local Linux SO 
    './libBearLibTerminal.dylib', # Local OS X dylib 
    './BearLibTerminal.so',  # Local Linux SO w/o prefix 
    'libBearLibTerminal.so',  # System Linux SO 
    'libBearLibTerminal.dylib', # System OS X dylib 
    'BearLibTerminal.so'   # System Linux SO w/o prefix 
] 

ctypes.windll.kernel32.SetDllDirectoryW(os.getcwd().replace('\\', '/')) 

for name in _possible_library_names: 
    try: 
     _library = ctypes.CDLL(name) 
     break 
    except OSError: 
     continue 

if _library is None: 
    raise RuntimeError("BearLibTerminal library cannot be loaded.") 

Et enfin, voici mon dossier dungeon.spec: pour vous assurer que le BearLibTerminal.dll est là

# -*- mode: python -*- 

block_cipher = None 


a = Analysis(['dungeon.py'], 
      pathex=['C:\\Users\\Brett\\Documents\\Projects\\Spark'], 
      binaries=[('BearLibTerminal.dll', '.')], 
      datas=[('enemies.json', '.'), ('items.json', '.'), ('materials.json', '.'), ('names.json', '.'), ('unifont-8.0.01.ttf', '.')], 
      hiddenimports=[], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 
pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      exclude_binaries=True, 
      name='dungeon', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True) 
coll = COLLECT(exe, 
       a.binaries, 
       a.zipfiles, 
       a.datas, 
       strip=False, 
       upx=True, 
       name='dungeon') 

Répondre

1

1) Vérifiez la dist/dossier (ou quel que soit le dossier .exe est) et prêt à être accédé. Votre fichier .exe ne fonctionnera pas s'il n'y est pas

2) Ensuite, vérifiez les dépendances. Il ne s'agit pas forcément du fait qu'il ne peut pas trouver BearLibTerminal.dll, mais il ne peut pas trouver ce dont dépend BearLibTerminal.dll. Si Visual Studio est installé sur votre ordinateur, utilisez dumpbin pour déterminer de quoi dépend votre DLL. (Dumpbin est installé ici C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ bin \ Dumpbin.exe)

dumpbin /DEPENDENTS your.dll 

cette wil liste les DLL qui BearLibTerminal.dll dépend. Assurez-vous qu'ils sont inclus dans le même répertoire que votre exe s'ils s'appliquent (kernel32.dll n'a pas besoin d'être dans ce répertoire par exemple)

3) si vous n'avez pas Visual Studio ou dumpbin, téléchargez http://www.dependencywalker.com/ et il accomplira la même chose

4) Si vous êtes sûr que votre DLL et les DLL dont il dépend sont tous pris en compte, vérifiez votre fichier spec pour être sûr qu'il est correctement formaté. S'il y a un tas d'avertissements affichés lors de l'exécution de pyinstaller, cela peut causer des problèmes. Surtout si sur Windows 10 (ils ne jouent pas bien: https://github.com/pyinstaller/pyinstaller/issues/1566)

5) Si BearLibTerminal.dll est votre propre DLL que vous avez compilé, assurez-vous qu'il a été construit en mode édition et votre bibliothèque d'exécution de génération de code C/C++ est/MT (multi-thread)

6) Assurez-vous d'avoir la version la plus récente de pyinstaller.

C'est beaucoup d'informations, mais j'espère que cela peut vous aider à résoudre votre problème. Je me suis occupé de la même question moi-même.