template setup msi instalar files cx_freeze python python-3.x cx-freeze

python - setup - KeyError: ''TCL_Library'' cuando uso cx_Freeze



pyinstaller (7)

Cuando uso cx_Freeze obtengo un keyError KeyError: ''TCL_Library'' mientras construyo mi programa pygame. ¿Por qué obtengo esto y cómo lo soluciono?

Mi setup.py está debajo:

from cx_Freeze import setup, Executable setup( name = "Snakes and Ladders", version = "0.9", author = "Adam", author_email = "Omitted", options = {"build_exe": {"packages":["pygame"], "include_files": ["main.py", "squares.py", "pictures/Base Dice.png", "pictures/Dice 1.png", "pictures/Dice 2.png", "pictures/Dice 3.png", "pictures/Dice 4.png", "pictures/Dice 5.png", "pictures/Dice 6.png"]}}, executables = [Executable("run.py")], )


El problema inicial de KeyError:

Esto funcionó para mí con Python 3.7 en Windows 7:

from cx_Freeze import setup, Executable import os import sys where = os.path.dirname(sys.executable) os.environ[''TCL_LIBRARY''] = where+"//tcl//tcl8.6" os.environ[''TK_LIBRARY''] = where+"//tcl//tk8.6" build_exe_options = {"include_files": [where+"//DLLs//tcl86t.dll", where+"//DLLs//tk86t.dll"]} setup( name = "SudoCool", version = "0.1", description = "Programme de SUDOKU", options={"build_exe": build_exe_options}, executables = [Executable("sudoku.py")] )

Ahora cx_Freeze está funcionando:

Mi aplicación esta funcionando:


En lugar de establecer las variables de entorno utilizando rutas absolutas específicas de instalación como C://LOCAL_TO_PYTHON//... también puede derivar dinámicamente las rutas necesarias utilizando el atributo __file__ del paquete estándar de Python como os :

import os.path 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'')

Después de esta corrección, se creará el archivo ejecutable, pero probablemente obtendrá un "error de DLL no encontrado" cuando intente ejecutarlo, al menos con Python 3.5.3 y cx_Freeze 5.0.1 en Windows 10.

Cuando agregue las siguientes opciones, los archivos DLL necesarios se copiarán automáticamente del directorio de instalación de Python a la salida de compilación de cx-Freeze y debería poder ejecutar su aplicación Tcl / Tk:

options = { ''build_exe'': { ''include_files'':[ os.path.join(PYTHON_INSTALL_DIR, ''DLLs'', ''tk86t.dll''), os.path.join(PYTHON_INSTALL_DIR, ''DLLs'', ''tcl86t.dll''), ], }, } # ... setup(options = options, # ... )


Puede solucionar este error configurando las variables de entorno manualmente:

set TCL_LIBRARY=C:/Program Files/Python35-32/tcl/tcl8.6 set TK_LIBRARY=C:/Program Files/Python35-32/tcl/tk8.6

También puede hacerlo en el script setup.py :

os.environ[''TCL_LIBRARY''] = r''C:/Program Files/Python35-32/tcl/tcl8.6'' os.environ[''TK_LIBRARY''] = r''C:/Program Files/Python35-32/tcl/tk8.6'' setup([..])

Pero descubrí que en realidad ejecutar el programa no funciona. En la lista de correo cx_freeze se mencionó :

Ya lo he examinado y no, no es solo una simple compilación, ¡o ya lo habría hecho! :-)

Está en progreso y parece que tomará un poco de esfuerzo. Parte del código en el lugar para manejar cosas como módulos de extensión dentro de paquetes se está cayendo, y eso puede resolverse mejor soltando ese código y forzando el paquete fuera del archivo zip (otra solicitud de extracción que debe ser absorbida). Debería tener algo de tiempo la próxima semana y la semana siguiente para investigar esto más a fondo. Así que, si todo funciona bien, debería publicar una nueva versión de cx_Freeze antes de fin de año.

Pero quizás tengas más suerte ... Aquí está el informe de error .


Si obtiene el siguiente error con Python 3.6:

copiando C:/LOCAL_TO_PYTHON/Python35-32/tcl/tcl8.6 -> build/exe.win-amd64-3.6/tcl error: [Errno 2] No such file or directory: ''C://LOCAL_TO_PYTHON//Python35-32//tcl//tcl8.6''

Simplemente cree el directorio LOCAL_TO_PYTHON en C: / luego cree el directorio Python35-32 dentro de él. Ahora copie el directorio tcl del directorio Python36 existente (en C :) en Python35-32.

Entonces funciona bien.

** Hice estos pasos y creé un archivo .exe en el directorio de compilación, pero si trato de hacer clic en la aplicación, no espere en la pantalla rápidamente, mis códigos aquí **

from tkinter import * import socket window=Tk() window.geometry("400x150") window.title("IpConfiger") window.config(background="black") def goster(): x=socket.gethostbyname(socket.gethostname()) label=Label(window,text=x,fg="green",font=("Helvetica",16)) label.pack() def information(): info=Label(window,text="Bu program anlık ip değerini bastırır.",fg="green",font=("Helvetica",16),bg="black") info.pack() information() tikla=Button(window,text="ip göster",command=goster) tikla.pack()


Si obtiene el siguiente error con Python 3.6:

copying C:/LOCAL_TO_PYTHON/Python35-32/tcl/tcl8.6 -> build/exe.win-amd64-3.6/tcl error: [Errno 2] No such file or directory: ''C://LOCAL_TO_PYTHON//Python35-32//tcl//tcl8.6''

Simplemente cree el directorio LOCAL_TO_PYTHON en C:/ luego cree el directorio Python35-32 dentro de él. Ahora copie el directorio tcl directorio Python36 existente (en C:/ ) en Python35-32 .

Entonces funciona bien.


Simplemente ponga esto antes de la configuración en setup.py

import os os.environ[''TCL_LIBRARY''] = "C://LOCAL_TO_PYTHON//Python35-32//tcl//tcl8.6" os.environ[''TK_LIBRARY''] = "C://LOCAL_TO_PYTHON//Python35-32//tcl//tk8.6"

Y ejecútalo:

python setup.py bdist_msi

Esto funcionó bien para mi.


La respuesta de DL Müller debe modificarse para cx_Freeze versión 5.1.1 o 5.1.0. En estas versiones de cx_Freeze, los paquetes se congelan en una biblioteca de subdirectorios del directorio de compilación. Las DLL TCL y TK también deben trasladarse allí. Esto se puede lograr pasando una tupla (source, destination) a la entrada correspondiente de la opción de lista include_files (consulte la documentación de cx_Freeze ).

En total, el script setup.py debe modificarse de la siguiente manera:

import os.path 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'') # ... options = { ''build_exe'': { ''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'')) ], }, } # ... setup(options = options, # ... )