From 2c3d25e790fb0dc6bf0afe87b90f59614c26f4db Mon Sep 17 00:00:00 2001 From: DokoGen Date: Mon, 3 Aug 2026 20:35:17 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20exe=20(PyInstaller)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dokogen.spec: упаковка dictionaries/, data/, словарей pymorphy3, скрытые импорты lxml/openpyxl; один файл dist/DokoGen.exe - build_exe.bat: установка PyInstaller + зависимостей + сборка --- build_exe.bat | 43 ++++++++++++++++++++++++++++++++++++ dokogen.spec | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 build_exe.bat create mode 100644 dokogen.spec diff --git a/build_exe.bat b/build_exe.bat new file mode 100644 index 0000000..4b65f56 --- /dev/null +++ b/build_exe.bat @@ -0,0 +1,43 @@ +@echo off +chcp 65001 >nul +title Сборка DokoGen.exe +echo ============================================ +echo Сборка DokoGen в один exe-файл +echo ============================================ +echo. + +cd /d "%~dp0" + +echo [1/3] Устанавливаю PyInstaller... +py -m pip install --upgrade pyinstaller +if errorlevel 1 ( + echo ОШИБКА: не удалось установить PyInstaller + pause + exit /b 1 +) + +echo. +echo [2/3] Устанавливаю зависимости программы... +py -m pip install -r requirements.txt +if errorlevel 1 ( + echo ОШИБКА: не удалось установить зависимости + pause + exit /b 1 +) + +echo. +echo [3/3] Собираю DokoGen.exe (займёт 1-3 минуты)... +py -m PyInstaller --clean --noconfirm dokogen.spec +if errorlevel 1 ( + echo ОШИБКА: сборка не удалась + pause + exit /b 1 +) + +echo. +echo ============================================ +echo ГОТОВО! Файл: dist\DokoGen.exe +echo Скопируй его на любой компьютер с Windows +echo и запускай двойным кликом - Python не нужен. +echo ============================================ +pause diff --git a/dokogen.spec b/dokogen.spec new file mode 100644 index 0000000..7179468 --- /dev/null +++ b/dokogen.spec @@ -0,0 +1,61 @@ +# -*- mode: python ; coding: utf-8 -*- +"""DokoGen — spec для PyInstaller. + +Сборка: py -m PyInstaller --clean --noconfirm dokogen.spec +Результат: dist/DokoGen.exe (один файл, запускается на любом Windows без Python). +""" +import sys +from PyInstaller.utils.hooks import collect_data_files, collect_submodules + +# ---------- Данные приложения ---------- +datas = [ + # Справочники (defense_tools.json, pd_actions.json, pd_items.json, pd_categories.json) + ('dokogen/dictionaries', 'dokogen/dictionaries'), + # Пустой опросник 152-ФЗ (для «Справка → Пустой опросник») + ('dokogen/data', 'dokogen/data'), +] + +# ---------- Словари pymorphy3 (обязательно!) ---------- +# Без них склонение организаций/ФИО в exe не будет работать. +datas += collect_data_files('pymorphy3_dicts_ru') +datas += collect_data_files('pymorphy3') + +# ---------- Скрытые импорты ---------- +hiddenimports = collect_submodules('pymorphy3') + collect_submodules('pymorphy3_dicts_ru') +hiddenimports += [ + 'lxml', 'lxml.etree', 'lxml._elementpath', + 'openpyxl', 'openpyxl.cell._writer', +] + +a = Analysis( + ['main.py'], + pathex=[], + binaries=[], + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) + +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='DokoGen', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, # GUI-приложение, без консоли + disable_windowed_traceback=False, + icon=None, +)