При использовании cx_Freeze и tkinter я получаю: "Ошибка загрузки DLL: указанный модуль не найден". (Python 3.5.3)

При использовании cx_Freeze и Tkinter мне выдается сообщение:

File "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 35, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: DLL load failed: The specified module could not be found.

Некоторые вещи на заметку:

  • Я хочу использовать Python 3+ (в настоящее время используется 3.5.3, 32-разрядная версия). На самом деле не волнует конкретная версия, что бы ни работало.
  • В моем проекте есть несколько файлов, которые мне нужно скомпилировать. Насколько я могу судить, это оставляет меня с cx_Freeze или Nuitka. У Нуйтки были свои проблемы.
  • Я использую 64-разрядную версию Windows 10 Home Edition

Вот мой текущий setup.py:

from cx_Freeze import setup, Executable    
import sys  

build_exe_options = {"packages": ["files", "tools"]}  

base = None    
if sys.platform == "win32":    
    base = "Win32GUI"    

setup(name="Name",  
      version="1.0",  
      description="Description",  
      options={"build_exe": build_exe_options},  
      executables=[Executable("main.py", base=base)],  
      package_dir={'': ''},  
      )

Я перепробовал много решений со всех уголков интернета. В том числе, но не ограничивается:

  • Несколько версий Python (и соответствующие версии cx_Freeze/Tkinter)
  • И 32-битные, и 64-битные версии
  • Замена Tkinter на easygui (очевидно, что для работы easygui нужен Tkinter)
  • Проверка переменных PATH
  • Перезагрузка компьютера (не знаю, чего я ожидал)
  • Удаление других версий Python и восстановление правильной версии
  • Поместив следующее в мой файл bat компиляции (Определенно правильные пути):

    set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tcl8.6
    set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tk8.6
    
  • Размещение следующего в моем setup.py:

    options={"build_exe": {"includes": ["tkinter"]}}
  • Вместе с:
    include_files = [r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tcl86t.dll",\
                     r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tk86t.dll"]

(И да, так или иначе они были включены в setup())


Спасибо за любую помощь, это очень ценится. И да, я рассмотрел практически все решения этой проблемы на этом сайте. Надеясь, что кто-то может помочь мне найти еще одно решение, так как моя проблема, кажется, остается постоянной.

2 ответа

Решение

Нашел решение!

Мне пришлось скопировать файлы tk86t.dll и tcl86t.dll из папки DLL моего каталога python в папку сборки с файлом main.py, который я пытался скомпилировать.

Это в сочетании с наличием

set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tcl8.6  
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tk8.6

в верхней части моего compile.bat, и в том числе
"include_files": ["tcl86t.dll", "tk86t.dll"]
в моих build_exe_options в setup.py, похоже, добился цели.

Вот мой текущий setup.py:

from cx_Freeze import setup, Executable  
import sys  

build_exe_options = {"packages": ["files", "tools"], "include_files": ["tcl86t.dll", "tk86t.dll"]}  

base = None  
if sys.platform == "win32":  
    base = "Win32GUI"  

setup(name="Name",  
    version="1.0",  
    description="Description",  
    options={"build_exe": build_exe_options},  
    executables=[Executable("main.py", base=base)],  
    package_dir={'': ''},  
    )  

А вот мой compile.bat (обновлен, чтобы показать все шаги):

@echo off
set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6
RD /S /Q "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
mkdir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tcl86t.dll"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tk86t.dll"
cd "C:\Users\VergilTheHuragok\Desktop\PythonProject\"
cxfreeze main.py --target-dir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin" --target-name "launch.exe"
pause  

Я нашел это решение здесь.

После исправления этих проблем cx_freeze все еще не мог импортировать зависимости панд (а именно numpy). Чтобы исправить это, я буквально скопировал и вставил целые папки в каталог.pyфайл, который я пытался скомпилировать. Исполняемый файл должен находиться в том же каталоге (поэтому он не обязательно является автономным), но он работает сpandas а также numpy.

образ

Чтобы решить эту проблему, просто скопируйте файлы 1.tcl86t.dll 2.tk86t.dll по этому пути C:\Users\h280126\AppData\Local\Programs\Python\Python36-32\DLLs и поместите их в наш.exe путь C:\Users\h280126\PycharmProjects\my_tool\build\exe.win32-3.6 работает нормально:)

Другие вопросы по тегам