Python PyQt5可执行文件因缺少DLL而崩溃

Python PyQt5可执行文件因缺少DLL而崩溃,python,pyqt5,pyinstaller,Python,Pyqt5,Pyinstaller,我的问题与我使用pyinstaller创建的pyqt5可执行文件有关。我使用的唯一命令是: pyinstaller script.py 我对Pyinstaller的输出消息不是很有经验。所以我在这里发布这个问题,以防其他人能帮我找出丢失的模块或文件是什么 以下是整个编译输出的副本: 这是出现的错误的副本。。它发生在一毫秒之内: 任何意见或帮助都将不胜感激。如果您认为您有一个可能的解决方案,请尝试回答。我相信这是值得研究的。希望这是因为我缺乏知识,所以很简单 另一个注意事项是,我正在导入/使

我的问题与我使用pyinstaller创建的pyqt5可执行文件有关。我使用的唯一命令是:

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