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")] )
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,
# ...
)