[PyQt5+Py2exe+Python2.7.14]打包exe遇到的坑

标签: PyQt

1.打包时找不到MSVCP90.dll报错
解决:打包脚本选项添加”dll_excludes”: [“MSVCP90.dll”,]

# -*- coding: utf-8 -*-

from distutils.core import setup
import py2exe
options = {"py2exe":{"compressed": 9, #压缩
                     "optimize": 2,
                     "dll_excludes": ["MSVCP90.dll",]  # 打包Qt需要
                     }}
setup(
    console=["slottest.py"],
    options=options,
    zipfile=None)

2.初始化时提示no module name sip
解决:在窗体的python文件内显式声明导入PyQt5下的sip包

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5 import sip  # 解决找不到的包问题

class Ui_Form(object):
    def setupUi(self, Form):

3.运行时报错could not find or load the Qt platform plugin “windows”
这个坑惨了我,网上有提供解决办法:
把pyqt5的插件目录如D:\Python27\Lib\site-packages\PyQt5\plugins下的platforms文件夹连同里面的内容一起拷贝到导出exe同目录的地方(考虑可移植性,推荐这种方式),或者添加一个环境变量:
变量名QT_QPA_PLATFORM_PLUGIN_PATH
值例如D:\Python27\Lib\site-packages\PyQt5\plugins\platforms

我这样做了以后,还是会报错,搜索好久,在stackOverflow的一个角落看到

Copy C:\Python34\Lib\site-packages\PyQt5\libEGL.dll to the same directory as your .exe.
Source: http://bird1110.blogspot.com/2014/04/python-33-pyqt5-and-cxfreeze-exe-on-64.html

遂将PyQt5包目录下的libEGL.dll也复制到exe文件所在路径,之后终于运行成功。

这里写图片描述

注意,在我这里如果bundle为一个文件,会在运行时不显示窗口,选择非bundle模式才可以打包成功。
如果不想看到运行时的命令行黑框,只想看到界面本身,则setup.py脚本里的console-改为windows=即可

顺便吐槽下这么个小窗体打下来要60多MB= =