【问题标题】:Cx_Freeze building without error but exe doesn't openCx_Freeze 构建没有错误,但 exe 没有打开
【发布时间】:2019-05-12 23:17:09
【问题描述】:

我正在尝试使用 cx_Freeze 构建一个 exe,它使用多个模块:

import tkinter as tk
from tkinter import ttk
import random, time, bluetooth, json, sys, os
from _thread import *
from threading import Thread, Lock

当我尝试构建 exe 时,它​​似乎运行良好:它不会引发任何错误并创建包含 exe 文件的构建文件夹。但是,当我尝试打开 exe 文件时,它根本无法打开。如果短暂似乎闪烁一个窗口,但随后消失。我的 setup.py 是这样的:

from cx_Freeze import setup,Executable
import sys
import os

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
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')

includes = []
include_files = []
packages = []
base = "Win32GUI"
setup(
    name = 'Buzzer',
    version = '0.1',
    description = 'Buzzer application',
    author = 'Me',
    executables = [Executable('Buzzer.py')]
)

闪烁的屏幕包含以下回溯:

Traceback(最近一次调用最后一次): 运行中的文件“C:\Users\X\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts__startup__.py”,第 14 行 模块运行() 运行中的文件“C:\Users\X\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts\Console.py”,第 26 行 exec(code, m.dict) 文件“print.py”,第 1 行,在 文件“C:\Users\X\AppData\Local\Programs\Python\Python37\lib\tkinter__init__.py”,第 36 行,在 import _tkinter # 如果失败,你的 Python 可能没有为 Tk 配置 ImportError: DLL load failed: 找不到指定的模块。

【问题讨论】:

  • 要在不闪烁屏幕的情况下打开程序,您可以打开终端窗口,导航到程序目录,然后将其作为命令运行。它应该告诉你哪里出了问题。

标签: python dll build exe cx-freeze


【解决方案1】:

您需要告诉cx_Freeze 在构建目录中包含 TCL 和 TK DLL。

对于cx_Freeze 5.1.1(当前版本)或5.1.0,DLL 需要包含在构建目录的lib 子目录中。您可以通过将元组 (source, destination) 传递给 include_files 列表选项的相应条目来做到这一点:

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'))]

您需要将此include_files 列表传递给设置调用中的build_exe 选项(您还应该将您定义的base 传递给Executable):

setup(
    name = 'Buzzer',
    version = '0.1',
    description = 'Buzzer application',
    author = 'Me',
    options={'build_exe': {'include_files': include_files}},
    executables = [Executable('Buzzer.py', base=base)]
)

对于其他cx_Freeze 版本,DLL 需要直接包含在构建目录中。这可以通过以下方式完成:

include_files = [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
                 os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll')]

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多