首页 > 解决方案 > 找不到 cx-freeze 模块,有教程吗?

问题描述

如何修改我的setup.py以便cx-freeze找到丢失的模块?这是我的 setup.py:

# Usage: Each project must have its own folder. 
# python setup.py build -> build on project directory 
# python setup.py bdist_msi -> bdist_msi to distribute 
# python setup.py install -> on "C:\Program Files" > "access denied" by Windows
# Using: 
# Python          3.7 
# cffi            1.13.2 
# cryptography    2.8    
# cx-Freeze       6.0    
# cycler          0.10.0 
# kiwisolver      1.1.0  
# matplotlib      3.1.2  
# numpy           1.17.4 
# pip             19.3.1 
# pycparser       2.19   
# pyparsing       2.4.5  
# PyQt5           5.13.2 
# PyQt5-sip       12.7.0 
# python-dateutil 2.8.1  
# scipy           1.3.3  
# setuptools      41.2.0 
# six             1.13.0 

from cx_Freeze import setup, Executable
buildOptions = dict(packages = [], excludes = [], include_files = [], includes = [])

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [
    Executable('FatigueCalculator.py', base=base)
]

setup(name='', # do not use \, :, etc. 
    version = '0.1',
    description = 'App. for college course Intermediate Mechanics',
    author="Echeban",
    author_email="",
    url="http//mecanica.cadec-online.com",# you can download the .msi
    options = dict(build_exe = buildOptions),
    executables = executables)

正如我读过的许多帖子一样(但我很难理解)我可以生成一个 .msi 安装程序,用它来在另一台机器上安装应用程序,如果安装了 Python 和 PyQt5 但在另一台机器上却没有,它将工作那些没有安装的地方。我得到的错误是找不到第 3 行模块。这是我的应用程序的导入部分,因此您可以看到第 3 行是什么:

import sys
import numpy as np 
from PyQt5.QtGui import QDoubleValidator
from FatigueDialog import Ui_Dialog # in QtDesigner, using "Dialog"
from PyQt5.QtWidgets import QDialog, QApplication, QListWidgetItem, QDialogButtonBox, QMessageBox
from FatigueKernel import *
from FatigueInteractionCriteria import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import QIcon, QPixmap

问题似乎是PyQt5.QtGui。接下来,我将违规行移到列表的底部

import sys
import numpy as np 
from FatigueDialog import Ui_Dialog # in QtDesigner, using "Dialog"
from FatigueKernel import *
from FatigueInteractionCriteria import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtGui import QDoubleValidator
from PyQt5.QtWidgets import QDialog, QApplication, QListWidgetItem, QDialogButtonBox, QMessageBox

现在在 FatigueDialog.py 的第 10 行失败了,它来自主 App 的第 3 行。这是第 10 行:

from PyQt5 import QtCore, QtGui, QtWidgets

因此,我了解 cx-freeze 无法获取 PyQt5。在 PyQt5 的第一个实例中,它失败了。但是如何修改我的 setup.py 以使其工作?

附录

为了简化我的求助请求,我下载了 cx-developer Anthony Tuininga 提供的示例代码。这是一个非常简单的应用程序 PyQt5app.py,和 setup.py 一起去,

示例代码

(venv375-32) python setup.py bdist_msi 在我的开发机器上运行,使用 Windows 10、Python 3.7.5-32 位、PyQt5 5.13.2、PyQt5-sip 12.7.0。然后使用 cx-freeze 6.0

python setup.py bdist_msi > PyQt5app_setup_log.txt

该构建在 dev 上运行良好。机器。我将 .msi 复制到没有安装 PyQt5 的机器上。我安装了 .msi,当我尝试运行它时,我收到了这个错误:

File PyQt5app.py Line 5 in <module> import error DLL load failed: The specified module could not be found.

应用程序中的第 5 行是: from PyQt5.QtWidgets import QApplication, QWidget

似乎在目标机器上安装 PyQt5 DLL 失败,但在安装过程中没有错误,仅在尝试运行应用程序时。

添加了发布输出的链接

python setup.py bdist_msi > PyQt5app_setup_log.txt

我使用 cx-freeze 6.0。对于 PyQt5app,我得到 46208 KB 的 msi。是否足够容纳 Python 3.7 和 PyQt?

PyQt5app_setup_log.txt

标签: python-3.xpyqt5cx-freeze

解决方案


我使用的是 cx-freeze 6.0。已安装cx-freeze 6.1(刚刚发布)。再次冻结我的应用程序。将其安装在目标机器上。问题解决了!

PS:目标机器已经安装了Microsoft Visual C++ 2015 Redistributable (x86)-14.0.24123;这是一项要求;像 2017 这样的较新版本也可以使用;否则你会得到另一个错误。


推荐阅读