【问题标题】:How to create .exe file with cx_Freeze along with third party python packages?如何使用 cx_Freeze 以及第三方 python 包创建 .exe 文件?
【发布时间】:2020-06-01 18:51:36
【问题描述】:

我是 python 编程的新手,我想创建一个 .exe 文件以及第三方 python 包。我的要求是,如果我将项目的源代码提供给任何开发人员,他/她将只需运行python setup.py build 以便创建 .exe 文件。我在setup.py 文件中也提到了install_requires,提到了第三方包,但我得到了错误。我在代码下方提供。这个要求类似于 java,基于 maven 的应用程序,用户运行 pom.xml 来创建可执行文件。

import sys
from cx_Freeze import setup, Executable

includefiles = []
includes = []
excludes = ['Tkinter']
packages = ['configparser == 4.0.2', 'colorama == 0.4.3', 'xlsxwriter == 1.2.7']
build_exe_options = {'includes':includes,'packages':packages, 'excludes':excludes, 'include_files':includefiles}

base = None

setup(name = 'Testing',
        version = '0.1',
        author = 'DD Mishra',
        description = 'A simple application',
        install_requires = ['configparser == 4.0.2', 'colorama == 0.4.3', 'xlsxwriter == 1.2.7'],
        options = {'build_exe': build_exe_options},
        executables = [Executable('main.py', base=base)]
)

我正在使用命令python setup.py build。首先,我想安装所有必需的包,如 configparsercoloramaxlsxwriter,然后应该创建 exe。一切都应该自动发生,无需使用pip 命令手动安装包。

根据我在运行命令python setup.py build 时的上述设置,我收到以下错误。

running build running build_exe Traceback(最近一次调用最后一次):
文件“setup.py”,第 13 行,在 setup(name = 'Testing', 文件 "C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\dist.py", 行 340,在设置中 distutils.core.setup(**attrs) 文件“C:\devsoftwares\Python38\lib\distutils\core.py”,第 148 行,在设置中 dist.run_commands() 文件“C:\devsoftwares\Python38\lib\distutils\dist.py”,第 966 行,在 运行命令 self.run_command(cmd) 文件“C:\devsoftwares\Python38\lib\distutils\dist.py”,第 985 行,在 运行命令 cmd_obj.run() 文件“C:\devsoftwares\Python38\lib\distutils\command\build.py”,第 135 行, 运行中 self.run_command(cmd_name) 文件“C:\devsoftwares\Python38\lib\distutils\cmd.py”,第 313 行,在 运行命令 self.distribution.run_command(command) 文件“C:\devsoftwares\Python38\lib\distutils\dist.py”,第 985 行,在 运行命令 cmd_obj.run() 文件“C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\dist.py”,行 211,运行中 freezer.Freeze() 文件 "C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\freezer.py", 第 610 行,冻结 self.finder = self._GetModuleFinder() 文件 "C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\freezer.py", 第 354 行,在 _GetModuleFinder 中 finder.IncludeModule(name) 文件“C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\finder.py”,行 631,在 IncludeModule 中 模块 = self._ImportModule(名称,deferredImports,文件“C:\devsoftwares\Python38\lib\site-packages\cx_Freeze\finder.py”,行 348,在 _ImportModule 中 raise ImportError("No module named %r" % name) ImportError: No module named 'configparser == 4.

0.2'

【问题讨论】:

    标签: java python python-3.x cx-freeze


    【解决方案1】:

    我有一个坏消息要告诉你。 虽然 setuptools 像你和我一样工作,也许很多其他人会想。 setuptools 可以完美地满足您通过这些漂亮的依赖项尝试实现的目标。我目前正在努力实现与您相同的目标。 https://setuptools.readthedocs.io/en/latest/setuptools.html?highlight=pip%20install%20requirements#setup-cfg-only-projects(仅使用 cfg 而不是 setup.py 脚本)。仍然在尝试。 Sooo保持更新,我会在这里做同样的事情。 但是,正如您猜想的那样,这个库并没有将同样的理念带到这里。

    根本原因(不是 WHY 的原因)

    我的“解决方法”很愚蠢,并不是真正的解决方法,而是一种了解背后原理的方法,但是您在那里所做的是在调试模式下检查,您不会相信,我在您的例如

    build_exe_options = {'packages':packages}
    

    正在通过几个步骤导入:采用 Python 默认包,如果不是:尝试从 ACTUAL PYTHONPATH(或 PATH)环境变量导入。哈哈。我看到了根本原因,还没有看到为什么。

    可能的解决方案(作为解决方法)

    所以每个人都踩到同一个兔子洞,避免它不指定包的版本,只指定他们的名字。如果列出的那些依赖项没有安装,你会感到惊讶:同样的失败会发生......

    我们可以清楚地看到,此选项的意图与 setuptools 中的 install_requires 不同,我们可以清楚地看到,如果没有该选项,则毫无疑问会获胜'不要'复制粘贴'依赖项,因为它就是这样做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多