使用 cx_Freeze、PyQt5、Python3 构建的 exe 无法导入 ExtensionLoader_PyQt5_QtWidgets.py 并运行

Posted

技术标签:

【中文标题】使用 cx_Freeze、PyQt5、Python3 构建的 exe 无法导入 ExtensionLoader_PyQt5_QtWidgets.py 并运行【英文标题】:exe built with cx_Freeze, PyQt5, Python3 can't import ExtensionLoader_PyQt5_QtWidgets.py and run 【发布时间】:2015-07-28 15:14:11 【问题描述】:

我正在尝试使用 cx_Freeze 打包我的应用程序 Python3、PyQt5 for Windows。 我已经安装了 Python 3.4.3、Python-win32、PyQT5、cxfreeze。 应用程序本身,在控制台中运行,工作正常。

我尝试用 cx_freeze 打包它: python setup.py build_exe。 它适用于同一主机。但是当我将它移动到另一个全新安装的 WinXP 时,它给出了一个错误:

Traceback:
File "C:\Python34\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27 in <module>
File "pyftp1.py" in 7, in <module>
File "c:\python\32-bit\3.4\lib\importlib\_bootstrap.py", in 2237, in _find_and_load
File "c:\python\32-bit\3.4\lib\importlib\_bootstrap.py", in 2226, in _find_and_load_unlocked
File "c:\python\32-bit\3.4\lib\importlib\_bootstrap.py", in 1191, in _load_unlocked
File "c:\python\32-bit\3.4\lib\importlib\_bootstrap.py", in 1161, in _load_backward_compatible
File "ExtensionLoader_PyQt5_QtWidgets.py", line 22, in <module>
File "ExtensionLoader_PyQt5_QtWidgets.py", line 14, in __bootstrap__ 
ImportError: DLL load failed: Не найден указанный модуль.

英文:“specified module was not found”。

这是我的 setup.py:

import sys
from cx_Freeze import setup, Executable

includes = ['sys', 'PyQt5', 'PyQt5.Core', 'PyQt5.QtGui', 'PyQt5.QtWidgets', 'os', 'os.path', 'ftplib',
    'traceback', 'time',]
excludes = []
packages = ['os', 'PyQt5']
path = []
build_exe_options = 
   'includes': includes,
   'excludes': excludes,
   'packages': packages,
   'path'    : path,
   #'dll_includes': ['msvcr100.dll'],
   'include_msvcr' : True,
   'include_files': [
       (r'C:\Windows\System32\msvcr100.dll', 'msvcr100.dll'),
   ],




base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

setup(
    name = "pyftp1",
    version = "0.1",
    description = "Foto uploader",
    options = 'build_exe_options': build_exe_options,
    executables = [Executable("pyftp1.py", base=base, appendScriptToLibrary=False, copyDependentFiles=True)]
)

我还发现它没有复制 msvcr100.dll 文件,但是我已经说过两次了!我已手动将其复制到目标主机。

这里是pyftp1.py:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys, time, os, hashlib
import ftplib
import traceback
from PyQt5.QtWidgets import QApplication, QWidget, QFileDialog  # <-- Line 7
from PyQt5.QtWidgets import QPushButton, QHBoxLayout, QVBoxLayout, QScrollArea, QLineEdit, QCheckBox
from PyQt5 import QtGui
from PyQt5.QtGui import QIcon, QPalette, QLinearGradient, QColor, QBrush
from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot

【问题讨论】:

【参考方案1】:

解决方案。

在解决一个问题很长时间后,我找到了解决方案。许多方法不考虑特定版本的软件,或使用的某些特定模块,甚至他们不检查新系统上的 .exe,没有你的库 dll 等等。这是有效且经过测试的解决方案。

首先,我删除了 cx_freeze 并使用了 py2exe。 我已经在 WinXP 32 位上构建了所​​有东西——目标是它几乎可以在每个系统上运行。 你需要:

Win XP 32 位(或您认为最低要求的其他系统) Python 3.4 -- 从 www.python.ord/download Windows x86 msi 安装程序安装 PyWin32 -- 从 sf.net pywin32-219.win32.py3.4.exe 安装 Qt5.5 -- 从 qt.io 安装它,你也会得到 mingw,接下来将文件夹 C:\Qt\Tools\mingw492_32\bin 添加到你的系统环境 %PATH%。 Windows 版 Git -- 从 git-scm.com 安装 PyQt5 -- 从 riverbankcomputing.co.uk win32 x86 安装程序下载并运行它 SIP——最糟糕的安装! 从 Riverbankcomputing.co.uk 下载, 解压, 运行 Git Bash, python configure.py -p win32-g++, mingw32-make.exe 安装。 失败(。您手动转到 sipgen/ 文件夹并将 sip.exe 复制到 c:\Python34。接下来转到 ../siplib 并将 sip.pyd 复制到 c:\python34\Lib\site-packages,然后 剥离/c/Python34/Lib/site-packages/sip.pyd cp sip.h /c/Python34/include/ py2exe -- python -m pip install py2exe 7-Zip -- 从 7-zip.org 安装为 x86 exe 7-zip 额外,解压到已安装的 7-zip 文件夹中,可以忽略与 .txt 文件的冲突 Resource Hacker -- 来自 angusj.com -- 但是如果您不想设置最终修补您的 .exe 并给它一个漂亮的图标,则没有必要

接下来我将 setup.py 添加到项目中:

from distutils.core import setup
import os, sys
import py2exe
from glob import glob
import PyQt5

NAME="ProgName"

qt_platform_plugins = [("platforms", glob(PyQt5.__path__[0] + r'\plugins\platforms\*.*'))]
data_files.extend(qt_platform_plugins)
msvc_dlls = [('.', glob(r'C:\Windows\System32\msvc?100.dll'))]
data_files.extend(msvc_dlls)
# print(data_files)

sys.argv.append('py2exe')

setup(
    data_files=data_files,
    # windows=["pyftp1.py",],
    windows=[
        
            "script": "pyftp1.py",
            "icon_resources": [(0, "resources/favicon.ico")]
        
    ],
    # zipfile=None,
    options=
        "py2exe": 
            "includes":["sip", "atexit",],
            # "packages": ['PyQt5'],
            "compressed": True,
            "dist_dir": "dist/" + NAME,
            # "bundle_files": 0,
            # "zipfile": None,
            "optimize": 2,
        
    
)

只是不要手动运行所有操作,您可以添加 Makefile

# start settings
DIST=dist
# change NAME also in setup.py and resource/config.txt
NAME=ProgName
EXT=exe

# final name and location of the built program
FINAL=$(DIST)/$(NAME).$(EXT)

# external programs
7ZIPDIR="C:\Program Files\7-Zip"
RESHACKER="/c/Program\ Files/Resource\ Hacker/ResourceHacker.exe"

# intermediate steps

# no icon version of program 
NOICON=$(DIST)/$(NAME)_no_icon.$(EXT)

# name of .7z archive
7Z_BASENAME=$(NAME).7z
7Z=$(DIST)/$(7Z_BASENAME)

# folder with ready .exe
PROGDIR=$(DIST)/$(NAME)

all: $(FINAL)


$(FINAL): $(NOICON)
    # change icon
    "$(RESHACKER)" -addoverwrite $(NOICON), $(FINAL), resources/favicon.ico, ICONGROUP, MAINICON, 0


$(NOICON): $(7Z)
    #build autorunning sfx with default icon
    cat $(7ZIPDIR)/7zS.sfx resources/config.txt $(7Z) > $(NOICON)


$(7Z): exe
    # compress program folder to .7z
    cd $(DIST);  $(7ZIPDIR)\\\7z.exe a  $(7Z_BASENAME)  $(NAME)


exe:  $(DIST)
    # build program itself
    python setup.py py2exe


$(DIST):
    # create dist directory
    # echo $(DIST)/


clean:
    rm -rf $(DIST)/*

现在您可以轻松构建程序本身 - 作为文件文件夹: mingw32-make.exe exe 或者制作一个带有正确图标的文件: mingw32-make.exe 全部 或者清理所有的东西: mingw32-make.exe 清理

【讨论】:

【参考方案2】:

你可以试试这个:

    将“libEGL.dll”添加到您的工作文件夹。这是来自 Python3x\Lib\site-packages\PyQt5

    在 cx-freeze setup.py 中添加:

    如果 sys.platform == "win32": includefiles = ['libEGL.dll'] #这里如果需要可以添加其他文件

    在 cx-freeze setup.py 中将“includefiles”链接到 build_exe_options,如下所示:

    build_exe_options= ... ... 'include_files':包含文件,

【讨论】:

我尝试手动添加它 - 但没有效果。这些方法有区别吗? 对不起,我不清楚。这是一种单一的方法,请按照步骤 1,2,3 谢谢!好的,我已经理解你了。不幸的是,我没有帮助(

以上是关于使用 cx_Freeze、PyQt5、Python3 构建的 exe 无法导入 ExtensionLoader_PyQt5_QtWidgets.py 并运行的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 3.7 PyQt5 和 cx_Freeze 创建可执行文件,但 DLL 无法加载

使用 cx_Freeze、PyQt5、Python3 构建的 exe 无法导入 ExtensionLoader_PyQt5_QtWidgets.py 并运行

如何在 Windows 10 上使用 Cx_Freeze 制作 exe,包括 PyQt5 和 OpenCV

cx_freeze/PyQt5: pywintypes.error: (2, 'BeginUpdateResource', '系统找不到指定的文件。'

使用 cx_Freeze 冻结时不显示主窗口图标

在 Windows 7 中使用 cx_freeze 创建的可执行文件在其他计算机上运行时崩溃并出现有关 PyQt5 的错误