Множественные ошибки появляются после того, как PyInstaller компилирует скрипт Python в EXEPython

Программы на Python
Ответить
Anonymous
 Множественные ошибки появляются после того, как PyInstaller компилирует скрипт Python в EXE

Сообщение Anonymous »

У меня есть скрипт Python, который я хотел бы скомпилировать в исполняемый файл. Наряду с этим скриптом у меня есть компонентный скрипт Python, который служит дополнительным поставщиком функций, работающим в фоновом режиме. Чтобы избежать необходимости заново вводить в командной строке очень длинную команду каждый раз, когда я хочу скомпилировать новую версию своей программы, я также настроил сценарий компилятора, использующий PyInstaller.
Сейчас я пытаюсь скомпилировать новую альфа-версию своей программы в EXE, чтобы представить ее другим людям, но компилятор повреждает сценарий, из-за чего впоследствии он отображает следующие ошибки:

Код: Выделить всё

Failed to start embedded python interpreter!

Код: Выделить всё

Failed to remove temporary directory: C:\Users\(user)\AppData\Local\Temp\_MEI255242

Код: Выделить всё

Traceback (most recent call last):
File "KyberoAntivirus.py", line 712, in 
File "KyberoAntivirus.py", line 611, in __init__
File "tkinter\__init__.py", line 2270, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
{C:\Users\(user)\AppData\Local\Temp\_MEI255242\_tcl_data} C:/Users/(user)/AppData/Local/Temp/lib/tcl8.6 C:/KyberoExec/lib/tcl8.6 C:/lib/tcl8.6 C:/KyberoExec/library C:/library C:/tcl8.6.12/library C:/tcl8.6.12/library

This probably means that Tcl wasn't installed properly.
Сам скрипт в порядке (как неоднократно проверялось из командной строки Python), и компонент тоже работает нормально, что наводит меня на мысль, что что-то не так либо со сценарием компилятора, либо с настройкой. Прошу с ним работать.
Код компилятора:

Код: Выделить всё

import os
import PyInstaller.__main__
import ssl
import sys
from PIL import Image

# Project settings
script_path = 'KyberoAntivirus.py'  # Main script
icon_png_path = 'assets/icon.png'  # PNG icon file
icon_path = 'assets/icon.ico'  # ICO icon file (optional)
dist_dir = 'dist'  # Output folder for the EXE
build_dir = 'build'  # Temp build files folder
hidden_imports = [
'tkinter', 'requests', 'urllib3', 'charset_normalizer', 'hashlib',
'threading', 'chardet', 'datetime', 'psutil', 'watchdog', 'plyer',
'pillow', 'io', 'PIL._tkinter_finder', 'PIL._imagingtk', 'PIL.ImageTk', '_tkinter',
'six', 'importlib_metadata', 'certifi', 'pyinstaller_hooks_contrib'
]

# Ensure required paths exist
if not os.path.exists(script_path):
raise FileNotFoundError(f"Script not found: {script_path}")

# Convert PNG to ICO if necessary
if os.path.exists(icon_png_path) and not os.path.exists(icon_path):
img = Image.open(icon_png_path)
img.save(icon_path)
print(f"Converted {icon_png_path} to {icon_path}")

if not os.path.exists(icon_path):
print("Icon file not found, continuing without icon.")
icon_path = None

# Locate Tcl/Tk directories manually
tcl_dir = os.path.join(sys.exec_prefix, "tcl", "tcl8.6")
tk_dir = os.path.join(sys.exec_prefix, "tcl", "tk8.6")

# PyInstaller command arguments
pyinstaller_args = [
'--onefile',  # Bundle everything into one EXE
'--noconsole',  # Suppress terminal window (for GUI apps)
'--name', 'KyberoAntivirus',  # Output EXE name
'--distpath', dist_dir,  # Output directory
'--workpath', build_dir,  # Build files directory
'--add-binary', f'{tcl_dir};tcl',
'--add-binary', f'{tk_dir};tk',
'--add-binary', f'{tcl_dir}\\init.tcl;tcl/tcl8.6',
'--add-binary', f'{tk_dir}\\tk.tcl;tcl/tk8.6',
'--add-data', os.path.join(os.getenv('LOCALAPPDATA'), 'Programs', 'Python', 'Python37', 'Lib', 'site-packages', 'charset_normalizer', '') + ';charset_normalizer',
'--add-data', 'c:\\KyberoExec\\KyberoAVbg.py;.',
script_path  # Main script
]

# Add icon if available
if icon_path:
pyinstaller_args.extend(['--icon', icon_path])

# Handle hidden imports
for module in hidden_imports:
pyinstaller_args.extend(['--hidden-import', module])

# Add option to bundle SSL certificates
pyinstaller_args.extend(['--add-data', f'{os.path.dirname(ssl.__file__)};ssl'])

# Run PyInstaller
PyInstaller.__main__.run(pyinstaller_args)

print("Build complete! Executable is in the dist/ folder.")
После некоторых (возможно видимых) попыток устранить проблему самостоятельно, я все еще не могу понять, в чем дело. Подводя итог, компилятор должен собрать все необходимые модули Python вместе с основным скриптом и скриптом компонента, связать модули и компонент в основную программу, затем скомпилировать все это в формат EXE и поместить результат в файл. папка расст. Есть идеи, как заставить это работать?
РЕДАКТИРОВАТЬ: Решения в вопросе, который был помечен как дубликат, мне не помогли. Windows утверждает, что у меня нет доступа к папке Lib моей среды Python, поэтому я не могу ничего туда скопировать, и если я попытаюсь поместить папки Tcl/Tk в любой из каталогов из трассировки, сценарий просто проигнорирует их.

Подробнее здесь: https://stackoverflow.com/questions/793 ... t-into-exe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»