You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:16:07