簡體   English   中英

Pyinstaller 未加載 DLL

[英]Pyinstaller not loading DLL

為我的 python 腳本dungeon.py構建一個 exe 后,當PyBearLibTerminal.py (我的程序導入的腳本)嘗試加載 DLL BearLibTerminal.dll時,我收到錯誤BearLibTerminal.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.

這是導致錯誤的PyBearLibTerminal.py文件的開頭。

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

最后,這是我的dungeon.spec文件:

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

1) 檢查 dist/ 文件夾(或 .exe 所在的任何文件夾)以確保 BearLibTerminal.dll 存在並且可以訪問。 如果不存在,您的 .exe 將不會運行

2)接下來檢查依賴項。 不一定是它找不到BearLibTerminal.dll,而是它找不到BearLibTerminal.dll依賴的東西。 如果您的計算機上安裝了 Visual Studio,請使用 dumpbin 找出您的 DLL 所依賴的內容。 (dumpbin 安裝在這里 C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\dumpbin.exe)

dumpbin /DEPENDENTS your.dll

這將列出 BearLibTerminal.dll 所依賴的 DLL。 如果它們適用,請確保它們與您的 exe 包含在同一目錄中(例如,kernel32.dll 不需要在該目錄中)

3) 如果您沒有 Visual Studio 或 dumpbin,請下載http://www.dependencywalker.com/它將完成同樣的事情

4) 如果您確定您的 DLL 及其所依賴的 DLL 都已考慮在內,請檢查您的規范文件以確保其格式正確。 如果在運行 pyinstaller 時顯示一堆警告,則可能會導致問題。 特別是在 Windows 10 上(它們不能很好地運行: https : //github.com/pyinstaller/pyinstaller/issues/1566

5) 如果 BearLibTerminal.dll 是您自己編譯的 dll,請確保它是在發布模式下構建的,並且您的 C/C++ 代碼生成運行時庫是 /MT(多線程)

6) 確保你也有最新版本的 pyinstaller。

這是很多信息,但希望它可以幫助解決您的問題。 我自己也在處理同樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM