我正在尝试使用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')]
)
闪烁的屏幕包含以下回溯:
回溯(最近通话最近): 运行中的文件“ C:\ Users \ X \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ cx_Freeze \ initscripts__startup __。py”,第14行 module.run() 正在运行的文件“ C:\ Users \ X \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ cx_Freeze \ initscripts \ Console.py”,第26行 exec(代码,m。 dict ) 文件“ print.py”,第1行,在 文件“ C:\ Users \ X \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __。py”,第36行,在 import _tkinter#如果失败,则可能没有为Tk配置Python ImportError:DLL加载失败:找不到指定的模块。
答案 0 :(得分:0)
您需要告诉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')]