![](/img/trans.png)
[英]Pyinstaller - Error loading Python DLL - FormatMessageW failed
[英]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.