cx-Freeze打包后QPrinter无法识别打印机问题求助
解决cx_Freeze打包PyQt5应用后QPrinter无法识别打印机的问题
我之前也碰到过一模一样的问题,核心原因是cx_Freeze默认不会打包PyQt5打印功能依赖的底层插件文件。下面给你一步步拆解解决方案:
问题根源
PyQt5的QtPrintSupport模块依赖Qt的printsupport插件(Windows下对应的是windowsprintersupport.dll),但cx_Freeze在打包过程中不会自动包含这个插件目录,导致exe运行时找不到打印机相关的驱动支持,自然识别不到任何打印机设备。
具体解决方案
1. 定位PyQt5的printsupport插件目录
先找到你Python环境里的PyQt5插件路径,一般是这个位置:
你的Python安装目录\Lib\site-packages\PyQt5\Qt\plugins\printsupport
里面会有一个windowsprintersupport.dll文件,这就是让打印机功能正常工作的关键插件。
2. 修改setup.py配置
需要把这个printsupport目录添加到include_files里,同时调整相关配置确保插件能被正确加载。修改后的setup.py示例如下:
from cx_Freeze import setup, Executable import os from PyQt5.QtCore import QCoreApplication # 自动获取PyQt5的plugins目录路径 pyqt_plugins_dir = os.path.join(os.path.dirname(QCoreApplication.__file__), 'plugins') # 定位printsupport插件子目录 printsupport_dir = os.path.join(pyqt_plugins_dir, 'printsupport') # 可选:如果platforms插件也缺失,一并添加 platforms_dir = os.path.join(pyqt_plugins_dir, 'platforms') executables = [Executable('KIWI_1105.py', targetName='KIWIv17.exe', icon='iconsN\\capsule.ico', shortcutName='KIWI', shortcutDir='DesktopFolder' )] excludes = ['email', 'http', 'urllib', 'unittest'] # 注意:不要把PyQt5的plugins目录打包进zip,否则Qt无法从zip加载插件 zip_include_packages = ['collections','distutils', 'encodings', 'importlib', 'logging', 'imageformats', 'PIL', 'pydoc_data', 'xml'] include_files = [ 'iconsN', 'Atlas', # 复制printsupport插件到打包后的plugins目录下 (printsupport_dir, 'plugins/printsupport'), # 若platforms插件缺失,添加这行 (platforms_dir, 'plugins/platforms') ] options = { 'build_exe': { 'excludes': excludes, 'zip_include_packages': zip_include_packages, 'include_files': include_files, 'include_msvcr': True, 'build_exe': 'KIWI', # 明确指定QT插件路径,确保程序能找到插件 'environment': {'QT_PLUGIN_PATH': 'plugins'} } } setup(name='KIWI App', author='23', version='17.1505', description='KIWI Viewer Application', executables=executables, options=options)
3. 关键修改点说明
- 添加printsupport目录到include_files:用
(源路径, 目标路径)的元组形式,把插件目录复制到打包后的plugins/printsupport下,保证程序运行时能找到插件。 - 调整zip_include_packages:移除了原来的
platforms和PyQt5,因为Qt无法从压缩包中加载插件,必须把插件目录通过include_files单独复制出来。 - 设置QT_PLUGIN_PATH:在环境变量里指定插件路径,进一步确保Qt能正确定位到插件目录。
4. 重新打包测试
删除之前的build目录,重新执行打包命令:
python setup.py build
运行生成的KIWIv17.exe,再调用打印功能,应该就能正常识别打印机列表了。
额外检查点
如果还是不行,可以做这两步排查:
- 确认打包后的
KIWI/plugins/printsupport目录下确实存在windowsprintersupport.dll文件。 - 检查是否有其他Qt插件缺失,比如
platforms目录下的qwindows.dll,如果之前没添加,按照上面的代码示例补充即可。
内容的提问来源于stack exchange,提问作者MacBaine
相关产品推荐
相关产品推荐

