feat: сборка в exe (PyInstaller)
- dokogen.spec: упаковка dictionaries/, data/, словарей pymorphy3, скрытые импорты lxml/openpyxl; один файл dist/DokoGen.exe - build_exe.bat: установка PyInstaller + зависимостей + сборка
This commit is contained in:
@@ -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
|
||||
@@ -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,
|
||||
)
|
||||
Reference in New Issue
Block a user