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



我试图使用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:Python34libsite-packagescx_FreezeinitscriptsConsole.py", line 27 in <module>
File "pyftp1.py" in 7, in <module>
File "c:python32-bit3.4libimportlib_bootstrap.py", in 2237, in _find_and_load
File "c:python32-bit3.4libimportlib_bootstrap.py", in 2226, in _find_and_load_unlocked
File "c:python32-bit3.4libimportlib_bootstrap.py", in 1191, in _load_unlocked
File "c:python32-bit3.4libimportlib_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:WindowsSystem32msvcr100.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

解决方案

在与一个问题斗争了很长时间之后,我找到了解决方案。许多教程没有考虑到软件的特定版本,或者使用了一些特定的模块,甚至他们没有检查。exe在新系统上,其中没有您的库dll等等。以下是经过测试的解决方案。

首先,我删除了cx_freeze并使用py2exe。我在32位的WinXP上构建了所有的东西——为了让它能在几乎所有的系统上运行。你需要:

  • windows XP 32位(或其他您认为最低要求的系统)
  • Python 3.4——install from www.python.ord/download Windows x86 msi installer
  • PyWin32——install from sf.net PyWin32 -219.win32.py3.4.exe
  • Qt5.5——从Qt .io安装,你也会得到mingw,接下来添加文件夹C:QtToolsmingw492_32bin到你的系统环境%PATH%。
  • Git for Windows——install from Git -scm.com
  • PyQt5—从riverbankcomputing.co.uk下载win32 x86安装程序并运行
  • SIP——最糟糕的安装!
    • 从riverbankcomputing.co下载。英国
    • 解压,
    • 运行Git Bash
    • python configuration .py -p win32-g++,
    • mingw32-make.exe安装。
    • 失败。您手动进入sipgen/文件夹,并将sip.exe复制到c:Python34。接下来去……/siplib并复制sip。pyd到c:python34Libsite-packages,然后
    • 带/c/Python34/Lib/网站/sip。pyd
    • cp sip.h/c/Python34/include/
  • py2exe——python -m pip install py2exe
  • 7-Zip—install from 7-zip.org as x86 exe
  • 7-zip extra,解压缩到已安装的7-zip文件夹,与。txt文件冲突可以忽略
  • 资源黑客——来自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'pluginsplatforms*.*'))]
data_files.extend(qt_platform_plugins)
msvc_dlls = [('.', glob(r'C:WindowsSystem32msvc?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 Files7-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清洁

你可以试试:

  1. 添加'libEGL.dll'到你的工作文件夹。这是来自Python3xLibsite-packagesPyQt5

  2. 在cx-freeze setup.py中添加:

    如果系统

    。平台== "win32":includefiles = ['libEGL.dll'] #这里你应该添加其他文件,如果你需要

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

    build_exe_options = {......"include_files":includefiles,}

最新更新