Python PyQt5可执行文件因缺少DLL而崩溃
我的问题与我使用pyinstaller创建的pyqt5可执行文件有关。我使用的唯一命令是:Python PyQt5可执行文件因缺少DLL而崩溃,python,pyqt5,pyinstaller,Python,Pyqt5,Pyinstaller,我的问题与我使用pyinstaller创建的pyqt5可执行文件有关。我使用的唯一命令是: pyinstaller script.py 我对Pyinstaller的输出消息不是很有经验。所以我在这里发布这个问题,以防其他人能帮我找出丢失的模块或文件是什么 以下是整个编译输出的副本: 这是出现的错误的副本。。它发生在一毫秒之内: 任何意见或帮助都将不胜感激。如果您认为您有一个可能的解决方案,请尝试回答。我相信这是值得研究的。希望这是因为我缺乏知识,所以很简单 另一个注意事项是,我正在导入/使
pyinstaller script.py
我对Pyinstaller的输出消息不是很有经验。所以我在这里发布这个问题,以防其他人能帮我找出丢失的模块或文件是什么
以下是整个编译输出的副本:
这是出现的错误的副本。。它发生在一毫秒之内:
任何意见或帮助都将不胜感激。如果您认为您有一个可能的解决方案,请尝试回答。我相信这是值得研究的。希望这是因为我缺乏知识,所以很简单
另一个注意事项是,我正在导入/使用模块ibm_db和包装器模块ibm_db_dbi
这是我的等级库文件的副本:
# -*- mode: python -*-
block_cipher = None
added_files = [
(r'C:\Python37\Lib\site-packages\ibm_db_dlls\ibm_db.dll', '.')
]
a = Analysis(['InheritMainWindow.py'],
pathex=['c:\\Python37\\PDFMaker_v3\\Prototype',
'C:\\Python37\\Lib\\site-packages\\',
'C:\\Python37\\Lib\\site-packages\\sqlalchemy\\connectors\\',
'C:\\Python37\\Lib\\site-packages\\clidriver\\',
'C:\\Python37\\Lib\\site-packages\\ibm_db_dlls',
'C:\\Python37\\Lib\\site-packages\\ibm_db.py'],
binaries=[('ibm_db.dll', 'ibm_db_dlls')],
datas=[],
hiddenimports=['ibm_db', 'ibm_db_dbi'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='InheritMainWindow',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
a.binaries = [x for x in a.binaries if os.path.dirname(x[1]).find("IBM") < 0]
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='InheritMainWindow')
在命令提示符中:
pyinstaller hello.py
在dist文件夹中执行exe时,您将得到与上述相同的错误
以下是我试图解决的问题列表:
1)在二进制文件中提供如下完整路径:
binaries=[(r'C:\Python37\Lib\site-packages\ibm_db_dlls\ibm_db.dll', 'ibm_db_dlls')]
这与崩溃仍然发生没有关系。我已经在我的dist文件夹中看到了ibm\u db\u dlls文件夹。因此,二进制文件被添加,但它只是不被看到
2)来自ibm开发者论坛:
建议的解决方案是使用--clean选项。我在“hello.py”上尝试过这个选项,它只导入ibm_db包,实际上它是一个exe。但是这个解决方案在我的主要项目上不起作用
更正:即使在简单的hello.py示例中,这也不起作用
最后更新:我在下面提供了一个解决方案 所以我解决了这个问题。我希望这能帮助很多人。解决方案的第一部分是PATHEX列表。我必须更新此列表以指向我系统的所有IBM目录:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['InheritMainWindow.py'],
pathex=['c:\\Python37\\PDFMaker_v3',
'C:\\Python37\\Lib\\site-packages\\ibm_db_dlls',
'C:\\Program Files (x86)\\ibm\\gsk8\\lib',
'C:\\Program Files (x86)\\ibm\\gsk8\\bin',
'C:\\Program Files (x86)\\IBM Informix Client SDK\\bin',
'C:\\Program Files (x86)\\IBM\\SQLLIB_01\\BIN',
'C:\\Program Files (x86)\\IBM\\SQLLIB_01\\FUNCTION',
'C:\\Program Files (x86)\\IBM\\SQLLIB_01\\BIN',
'C:\\Program Files (x86)\\IBM\\SQLLIB_01\\FUNCTION',
'C:\\Program Files (x86)\\ibm\\gsk8\\lib',
'C:\\Program Files (x86)\\ibm\\gsk8\\bin',
'C:\\Program Files (x86)\\IBM Informix Client SDK\\bin'],
binaries=[(r'C:\Python37\Lib\site-packages\ibm_db_dlls\ibm_db.dll', 'ibm_db_dlls')],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='InheritMainWindow',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='InheritMainWindow')
答案的下一部分是很难弄清楚的。它位于imb_db.py文件中:
import os
if 'clidriver' not in os.environ['PATH']:
os.environ['PATH'] = os.environ['PATH'] + ";" + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'clidriver', 'bin')
def __bootstrap__():
global __bootstrap__, __loader__, __file__
import sys, pkg_resources, imp
__file__ = pkg_resources.resource_filename(__name__,'ibm_db_dlls\\ibm_db.dll')
__loader__ = None; del __bootstrap__, __loader__
imp.load_dynamic(__name__,__file__)
__bootstrap__()
我必须更新路径变量以包含clidriver目录:
C:\Python37\Lib\site-packages\clidriver\bin
假设imb_db.py正在将其添加到路径中,但其添加格式或目录错误。因此,下一行:
__file__ = pkg_resources.resource_filename(__name__,'ibm_db_dlls\\ibm_db.dll')
最终找不到.dll文件。因此,在完成这两个更新之后,程序运行并成功地连接到远程DB2数据库 @RockAndRoleCoder感谢您的提问和回答。我在Windows7 Python 3.7 ibm db 3.0.1中遇到了同样的情况
根据您的提示,我认为原因是exe在clidriver\bin和ibm_db.dll中找不到*.dll, 并用类似的方法分两步求解 第一条: 与您一样,将clidriver目录添加到系统路径
**\site-packages\clidriver\bin
秒
带参数打包--添加二进制文件
Pyinstaller --add-binary **\Lib\site-packages\ibm_db_dlls\ibm_db.dll;.\ibm_db_dlls myproject.py
那就好了
Pyinstaller --add-binary **\Lib\site-packages\ibm_db_dlls\ibm_db.dll;.\ibm_db_dlls myproject.py