【问题标题】:Create exe file from Python file using cx_Freeze [duplicate]使用 cx_Freeze 从 Python 文件创建 exe 文件
【发布时间】:2019-08-28 14:49:33
【问题描述】:

在 PyQt5 中使用 cx_Freeze,我得到以下错误:

ImportError: 没有名为“PyQt5.Qt”的模块

我的setup.py文件如下:

from cx_Freeze import setup, Executable

base = None

executables = [Executable("Chemistry.py", base=base)]

packages = ["idna", "sys", "pandas", "PyQt5"]
options = {
    'build_exe': {
        'packages':packages,
    },
}

setup(
    name = "<any name>",
    options = options,
    version = "<any number>",
    description = '<any description>',
    executables = executables
)

如何解决此错误?我使用的是 Windows 操作系统。

【问题讨论】:

  • 在尝试构建(启动 cx_Freeze 设置)或尝试运行可执行文件时是否收到错误?
  • 当我尝试构建应用程序时。我完全迷失了。
  • 你能用完整的错误输出编辑你的问题吗?
  • @eyllanesc 我建议交换这个重复对的源和目标,因为这个问题有一个公认的答案,而另一个没有,也可能永远不会有(它的 OP 似乎已经离开了所以)。这个问题似乎我也是一个更好的规范(更容易理解)。但是另一个问题的标题更好,可能还需要编辑两个标题。
  • @jpeg 重复不取决于是否有一个接受的答案,除了重复不是为了表明某事比另一个更好,它只是为了表明一个答案已经存在并且你在评论中指出,最后重复并不意味着出版物的消除只是明确表明问题之间的关系。

标签: python pyqt5 cx-freeze


【解决方案1】:

尝试this solution 回答类似问题:

  1. packages 列表中删除"PyQt5"
  2. 让 cx_Freeze 将整个PyQt5 目录复制到构建目录的lib 子目录中。您可以通过将(source, destination) 元组传递给include_files 列表来做到这一点,该列表告诉cx_Freeze 将source(一个文件或整个目录)复制到相对于构建目录的destination(参见cx_Freeze @ 987654322@)。将source 设置为os.path.dirname(PyQt5.__file__),它给出了Python 安装的PyQt5 包的目录(通过它的__init__.py 文件),以及"lib" 的目标。
  3. 另外,如果你的应用真的使用了pandas,你还需要将"numpy"添加到packages列表中,见cx_Freeze not able to build msi with pandasCreating cx_Freeze exe with Numpy for Python

总而言之,尝试如下修改您的 setup.py 脚本:

import os
import PyQt5
include_files = [(os.path.dirname(PyQt5.__file__), "lib")]
packages = ["idna", "sys", "numpy", "pandas"]
options = {
    'build_exe': {
        'include_files':include_files,
        'packages':packages,
    },
}

【讨论】:

  • 这非常有效。我为此苦苦挣扎了好几天。非常感谢
  • 这行代码做了什么include_files = [(os.path.dirname(PyQt5.__file__), "lib")]
  • @user1655130 我在回答中添加了解释。
  • 我今天去重新运行这个完全相同的代码,现在我收到以下错误:TypeError: expected str, bytes or os.PathLike object, not NoneType 来自这一行:include_files = [(os.path.dirname(PyQt5.__file__), "lib")] 任何想法为什么会这样?谢谢
  • 这可能是因为__file__ 属性并非在所有情况下都设置。特别是,静态链接到解释器的 C 模块不存在,请参阅what does the __file__ variable mean/do?。是不是你这次从解释器重新运行了相同的代码,而上一次是从cmd 提示符中重新运行的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
相关资源
最近更新 更多