KeyError: "TCL_Library", когда я использую cx_Freeze
Когда я использую cx_Freeze
, я получаю keyerror KeyError: 'TCL_Library'
при создании моей программы pygame. Почему я получаю это и как его исправить?
My setup.py находится ниже:
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")],
)
Ответы
Ответ 1
Вы можете обойти эту ошибку, установив переменные среды вручную:
set TCL_LIBRARY=C:\Program Files\Python35-32\tcl\tcl8.6
set TK_LIBRARY=C:\Program Files\Python35-32\tcl\tk8.6
Вы также можете сделать это в сценарии 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([..])
Но я обнаружил, что фактически запуск программы не работает. В списке рассылки cx_freeze было упомянуто:
Я уже заглянул в него и нет, это не просто перекомпиляция - или это уже было бы сделано! :-)
Это продолжается, и похоже, что потребуется немного усилий. Некоторая часть кода, предназначенная для обработки таких вещей, как модули расширения внутри пакетов, падает, и это может быть лучше решено путем удаления этого кода и форсирования пакета за пределами zip файла (еще один запрос на перенос, который должен быть поглощен). У меня должно быть некоторое время на следующей неделе и на следующей неделе, чтобы изучить это дальше. Итак, все, что хорошо работает, я должен опубликовать новую версию cx_Freeze до конца года.
Но, возможно, вам больше повезло... Вот отчет об ошибке.
Ответ 2
Вместо того, чтобы устанавливать переменные среды с использованием конкретных абсолютных путей установки, таких как C:\\LOCAL_TO_PYTHON\\...
, вы также можете динамически выводить необходимые пути с помощью атрибута __file__
стандартного пакета Python, такого как 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')
После этого исправить исполняемый файл будет создан, но вы, вероятно, получите "DLL не найденную ошибку" при попытке выполнить ее - по крайней мере, с Python 3.5.3 и cx_Freeze 5.0.1 в Windows 10.
При добавлении следующих параметров необходимые DLL файлы будут автоматически скопированы из каталога Python-Installation в build-output cx-Freeze и вы сможете запустить приложение 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,
# ...
)
Ответ 3
Просто поставьте это до установки на 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"
И запустите его:
python setup.py bdist_msi
Это сработало для меня.
Ответ 4
Если у вас возникла ошибка с 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'
Просто создайте LOCAL_TO_PYTHON
dir в C:\
, затем создайте в нем Python35-32
dir. Теперь скопируйте tcl
dir из существующего Python36
dir (в C:\
) в Python35-32
.
Тогда он отлично работает.
Ответ 5
Если у вас возникла ошибка с python 3.6:
копирование 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'
Просто создайте LOCAL_TO_PYTHON dir в C: \, затем создайте в нем Python35-32. Теперь скопируйте tcl dir из существующего каталога Python36 (в C :) в Python35-32.
Тогда он отлично работает.
** Я сделал эти шаги и создал файл.exe в каталоге сборки, но если ı попытаться щелкнуть приложение, не ждать на экране мгновенно быстро, мои коды здесь **
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()
Ответ 6
Ответ DL Müller необходимо изменить для версии cx_Freeze 5.1.1 или 5.1.0. В этих версиях cx_Freeze пакеты замораживаются в подкаталоге lib
каталога build. Библиотеки TCL и TK также должны быть перемещены туда. Это может быть достигнуто путем передачи кортежа (source, destination)
в соответствующую запись опции списка include_files
(см. Документацию cx_Freeze).
В целом сценарий setup.py
необходимо изменить следующим образом:
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,
# ...
)
Ответ 7
Начальная проблема KeyError:
![KeyError]()
Это работает для меня с Python 3.7 на 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")]
)
Теперь cx_Freeze работает:
![it's working]()
![enter image description here]()
![enter image description here]()
Мое приложение работает:
![enter image description here]()