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, +)