【问题标题】:How to compile executable with cx_Freeze with modules in Python 3.x如何在 Python 3.x 中使用带有模块的 cx_Freeze 编译可执行文件
【发布时间】:2018-11-12 19:48:54
【问题描述】:

这是我在这里的第一篇文章,所以如果我犯了错误,请告诉我,我会纠正它。我在python 3.6,Windows 10,我有一个需要用cx_Freeze 编译的程序。我无法让我的setup.py 工作,当我尝试编译时出现错误。我正在尝试编译的程序以:

import pygame
from pygame.locals import *
import sys
import time
import tkinter
from tkinter import filedialog
from tkinter import messagebox

我需要所有这些才能使程序运行,但我需要使用cx_Freeze 编译它,请有人帮助我!

我的setup.py

from cx_Freeze import setup, Executable

base = None

executables = [Executable("to-compile.py", base=base)]

packages = ["idna","os","sys","tkinter","pygame"]
options = {'build_exe' : {'packages':packages}}

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

我有一个 compiler.bat,其中包含:

python setup.py build

我的错误是: Powershell Error

似乎我无法插入图片,但我需要声望。

PyInstaller 不起作用:

我会在pastebin发布错误代码

如果 py2exe(或该编译器的任何变体)有解决问题的方法,请告诉我,请记住我在 python 3 中。

【问题讨论】:

  • 您需要正确编辑您的问题并向我们提供您遇到的错误。
  • 我可以使用PyInstaller 轻松构建二进制文件。就像pyinstaller my_script.py 一样简单。
  • 请提供您的错误信息(请提供文本)。请参阅here 如何使用cx_Freeze 冻结基于tkinter 的应用程序。
  • @Eric 我会试试 PyInstaller。
  • @karma4917 我已经编辑了问题并包含了我的错误消息。我还有什么遗漏吗?

标签: python python-3.x tkinter pygame cx-freeze


【解决方案1】:

您需要设置环境变量TCL_DIRECTORYTK_DIRECTORY 并告诉cx_Freeze 使用build_exe 选项include_files 包含Tcl 和Tk DLL,就像在this answer 中所做的那样。如果您使用的是cx_Freeze 5.1.1 或 5.1.0,则需要稍有不同,请参阅this answer

此外,您应该为 Windows 下的 GUI 应用程序设置base = "Win32GUI"

综上所述,假设您使用的是cx_Freeze 5.1.1(当前版本),请尝试使用以下安装脚本:

from cx_Freeze import setup, Executable

import os
import sys
PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

include_files = [(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
                 (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))]
packages = ["idna","os","sys","tkinter","pygame"]
options = {'build_exe' : {'packages':packages, 'include_files':include_files}}

# GUI applications require a different base on Windows (the default is for a console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

executables = [Executable("to-compile.py", base=base)]

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

【讨论】:

  • 好的,我试试。我还需要包含时间模块,那么我该如何包含呢?编辑:我也需要 sys。
  • @PythonPro 根据我目前的经验,cx_Freeze 正确地包含了time 模块,您不需要手动包含它。只需将其导入您使用它的主脚本中,正如您在问题开头所显示的那样。就sys 而言,我在答案的设置脚本中忘记了import sys,我现在已经更正了(第4 行),抱歉。
  • 它不起作用。运行 setup() 时出现错误 - 错误pastebin.com/raw/9zG3B3Kk
  • @PythonPro 在设置脚本中,setup 的版本参数应该是 version 而不是 versions 并且给定的值应该匹配一个特定的模式(最多 3 个数字由点,确切的规则可以在distutils的源代码中找到)。我已相应地更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2021-10-12
  • 2017-06-25
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多