python-3.x - 找不到 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?
解决方案
我使用的是 cx-freeze 6.0。已安装cx-freeze 6.1
(刚刚发布)。再次冻结我的应用程序。将其安装在目标机器上。问题解决了!
PS:目标机器已经安装了Microsoft Visual C++ 2015 Redistributable (x86)-14.0.24123;这是一项要求;像 2017 这样的较新版本也可以使用;否则你会得到另一个错误。
推荐阅读
- java - Spring @RequestParam - 混合命名参数和地图
参数 - sql - 任何人都知道这张表是什么类型的范式
- javascript - Google Analytics 中的 iOS 电话超链接 javascript 跟踪
- sql - 在 SQL Server 中将字节转换为带有精确小数的 GB
- wildfly - Infinispan Cache 和 computeIfAbsent 的 lambda 反序列化无效
- objective-c - UISlider 上的 RACChannelTerminal 何时使用 nil 覆盖
- sql-server - 在 SELECT 语句中的单独行中返回列
- apache - 重写规则可见性可能吗?
- ios - 解雇键盘 - 无法识别的选择器
- php - 尝试通过按钮发布