2017-09-30 7 views
1

Nach dem Erstellen einer Exe für mein Python-Skript dungeon.py, bekomme ich einen Fehler, wenn PyBearLibTerminal.py (ein Skript, das mein Programm importiert) versucht, eine DLL BearLibTerminal.dll zu laden. Das Skript läuft einwandfrei, es wird nur die ausführbare Datei ausgeführt, die den Fehler verursacht. Der Fehler, der gemeldet wird, wenn die ausführbare Datei ausgeführt wird,Pyinstaller DLL nicht geladen

[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. 

Dies ist der Anfang der PyBearLibTerminal.py Datei, wo der Fehler verursacht wird.

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.") 

Und schließlich, hier ist meine dungeon.spec Datei:

# -*- 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') 

Antwort

1

1) Überprüfen Sie den dist/Ordner (oder was auch immer Ordner die .exe), um sicherzustellen, dass die BearLibTerminal.dll ist und bereit für den Zugriff. Ihre .exe-Datei wird nicht ausgeführt, wenn sie nicht vorhanden ist

2) Überprüfen Sie als Nächstes die Abhängigkeiten. Es ist nicht unbedingt die Tatsache, dass es BearLibTerminal.dll nicht finden kann, aber es kann nicht finden, was BearLibTerminal.dll abhängt. Wenn Sie Visual Studio auf Ihrem Computer installiert haben, verwenden Sie dumpbin, um herauszufinden, worauf Ihre DLL angewiesen ist. (Dumpbin ist hier C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ bin \ Dumpbin.exe)

dumpbin /DEPENDENTS your.dll 

diese wil die DLLs auflisten, die BearLibTerminal.dll abhängt. Stellen Sie sicher, dass sie im selben Verzeichnis wie die EXE enthalten sind, wenn sie angewendet werden (z. B. muss sich kernel32.dll nicht in diesem Verzeichnis befinden).

3) Wenn Sie Visual Studio oder dumpbin nicht haben, laden Sie http://www.dependencywalker.com/ herunter und es wird dasselbe erreichen

4) Wenn Sie sicher sind, dass Ihre DLL und die DLLs, auf die es ankommt, alle berücksichtigt sind, überprüfen Sie Ihre Spezifikationsdatei, um sicherzustellen, dass sie richtig formatiert ist. Wenn beim Ausführen von pyinstaller mehrere Warnungen angezeigt werden, kann dies zu Problemen führen. Besonders wenn unter Windows 10 (sie nicht gut spielen: https://github.com/pyinstaller/pyinstaller/issues/1566)

5) Wenn BearLibTerminal.dll ist Ihre eigene DLL, die Sie kompiliert, stellt sicher, dass es in Release-Modus und Ihre C/C++ Code Generation Runtime-Bibliothek gebaut wurde is/MT (multi-threaded)

6) Stellen Sie sicher, dass Sie auch die neueste Version von pyinstaller haben.

Es ist eine Menge Informationen, aber hoffentlich kann es helfen, Ihr Problem zu lösen. Ich habe mich selbst mit dem gleichen Thema beschäftigt.

Verwandte Themen