@echo off chcp 65001 >nul cd /d "%~dp0%" setlocal enabledelayedexpansion REM Установка переменных set home_dir=%~dp0% set python_dir=python312 set python_url=https://www.python.org/ftp/python/3.12.10/python-3.12.10-embed-amd64.zip :start REM Проверяем, установлен ли уже 7za.exe if exist "%python_dir%\7za.exe" (move /y %python_dir%\7za.exe 7za.exe) >nul if exist 7za.exe ( echo [ ] 7zip уже скачан: Использую локальную версию ) else ( echo [*] Скачивание 7zip certutil.exe -urlcache -split -f "https://www.7-zip.org/a/7zr.exe" 7zr.exe >nul certutil.exe -urlcache -split -f "https://www.7-zip.org/a/7z2500-extra.7z" 7z2500-extra.7z >nul 7zr.exe x 7z2500-extra.7z 7za.exe -y >nul del 7zr.exe del 7z2500-extra.7z ) if exist "%python_dir%/python.exe" ( for /f "tokens=2" %%V in ('cmd /c ^""%python_dir%\python.exe" --version^"') do set "python_version=%%V" echo [ ] Python уже скачан: Использую локальную версию !python_version! ) else ( echo [*] Скачивание Python certutil.exe -urlcache -split -f "https://www.python.org/ftp/python/3.12.10/python-3.12.10-embed-amd64.zip" python.zip >nul 7za.exe x python.zip -o"%python_dir%" >nul for /f "tokens=2" %%V in ('cmd /c ^""%python_dir%\python.exe" --version^"') do set "python_version=%%V" for /f "tokens=1,2 delims=." %%a in ("!python_version!") do set "python_short_version=python%%a%%b" echo [*] Скачан Python !python_version! del python.zip echo [*] Установка pip cd "%python_dir%" certutil.exe -urlcache -split -f "https://bootstrap.pypa.io/get-pip.py" get-pip.py >nul python.exe get-pip.py --no-warn-script-location del get-pip.py echo [*] Изменение !python_short_version!._pth echo Lib>> !python_short_version!._pth echo Lib\site-packages>> !python_short_version!._pth echo import site>> !python_short_version!._pth python.exe -m pip install --upgrade pip setuptools wheel --no-cache-dir --no-warn-script-location cd .. if exist "requirements.txt" ( %python_dir%\python.exe -m pip install -r requirements.txt --no-cache-dir --no-warn-script-location ) ) :venv_setup set update=False set no_changes=False if exist "%python_dir%\Scripts\activate.bat" ( if exist "%python_dir%\pyvenv.cfg" ( echo [ ] Виртуальное окружение уже сконфигурировано\ for /f "tokens=2 delims==" %%H in ('findstr /r "^base-executable[ ]*=" "%python_dir%\pyvenv.cfg"') do (set "installed_home=%%H") rem Удаляем пробелы и кавычки по краям for /f "tokens=* delims= " %%B in ("!installed_home!") do (set "installed_home=%%B") set "installed_home=!installed_home:"=!" rem Выводим для отладки echo Текущий путь в pyvenv.cfg: !installed_home! echo Ожидаемый путь: %home_dir%%python_dir%\python.exe rem Сравниваем пути if /i "!installed_home!"=="%home_dir%%python_dir%\python.exe" ( echo Конфигурация верная. Обновление не требуется set no_changes=True goto skip_venv ) else ( echo Путь портативной устаноки изменился. set /p "update=Требуется обновление. Обновить? [Y/Д] нет по умолчанию: " if /i "!update!"=="Y" ( set update=True echo Обновляем... ) else ( if /i "!update!"=="Д" ( set update=True echo Обновляем... goto venv_config ) echo Пропускаем обновление. goto skip_venv ) ) )) :venv_config echo [*] Конфигурация виртуального окружения if exist %python_dir%\Lib\site-packages\sitecustomize.py ( echo [ ] Lib\site-packages\sitecustomize.py существует и не требует обновления goto skip_sitecustomize ) else ( echo [*] Создание sitecustomize.py для исправления site.getsitepackages и sys.prefix ) ( echo import site echo import os echo import sys echo project_root = os.path.abspath^(os.path.join^(os.getenv^('VIRTUAL_ENV'^), '..'^)^) echo if project_root in sys.path: echo sys.path.remove^(project_root^) echo sys.prefix = os.getenv^('VIRTUAL_ENV'^) echo sys.exec_prefix = os.getenv^('VIRTUAL_ENV'^) echo def getsitepackages^(^): echo return [os.path.join^(os.getenv^('VIRTUAL_ENV'^), 'Lib', 'site-packages'^)] echo site.getsitepackages = getsitepackages ) > "%python_dir%\Lib\site-packages\sitecustomize.py" :skip_sitecustomize echo [*] Создание %python_dir%\pyvenv.cfg ( echo home = %home_dir%%python_dir% echo implementation = CPython echo version_info = %python_version% echo virtualenv = 20.31.2 echo include-system-site-packages = false echo base-prefix = %home_dir%%python_dir% echo base-exec-prefix = %home_dir%%python_dir% echo base-executable = %home_dir%%python_dir%\python.exe ) > "%python_dir%\pyvenv.cfg" echo [*] Создание %python_dir%\Scripts\activate.bat ( echo @echo off echo REM This file is UTF-8 encoded, so we need to update the current code page while executing it echo chcp 65001 ^> nul echo set "VIRTUAL_ENV=%home_dir%%python_dir%" echo set "VIRTUAL_ENV_PROMPT=%python_dir%" echo if defined _OLD_VIRTUAL_PROMPT ^( echo set "PROMPT=%%_OLD_VIRTUAL_PROMPT%%" echo ^) else ^( echo if not defined PROMPT ^( echo set "PROMPT=$P$G" echo ^) echo if not defined VIRTUAL_ENV_DISABLE_PROMPT ^( echo set "_OLD_VIRTUAL_PROMPT=%%PROMPT%%" echo ^) echo ^) echo if not defined VIRTUAL_ENV_DISABLE_PROMPT ^( echo set "PROMPT=(%%VIRTUAL_ENV_PROMPT%%) %%PROMPT%%" echo ^) echo if defined _OLD_VIRTUAL_PYTHONHOME ^( echo set "PYTHONHOME=%%_OLD_VIRTUAL_PYTHONHOME%%" echo ^) else ^( echo set "_OLD_VIRTUAL_PYTHONHOME=%%PYTHONHOME%%" echo ^) echo set "PYTHONHOME=" echo if defined _OLD_VIRTUAL_PATH ^( echo set "PATH=%%_OLD_VIRTUAL_PATH%%" echo ^) else ^( echo set "_OLD_VIRTUAL_PATH=%%PATH%%" echo ^) echo set "PATH=%%VIRTUAL_ENV%%;%%VIRTUAL_ENV%%\Scripts;%%PATH%%" echo set "PYTHONPATH=%%VIRTUAL_ENV%%\Lib\site-packages" echo chcp %%_OLD_CODEPAGE%% ^> nul ) > %python_dir%\Scripts\activate.bat :skip_venv call %python_dir%\Scripts\activate.bat if exist run_me.bat ( echo [ ] run_me.bat существует, не требует обновления goto skip_run_me ) echo [+] Создание run_me.bat ( echo cd /d "%%~dp0%%" echo call %python_dir%\Scripts\activate.bat echo call python main.py echo pause ) > run_me.bat :skip_run_me REM Храним 7zip внутри папки Python if exist 7za.exe (move /y 7za.exe %python_dir%\7za.exe )>nul if %no_changes%==True ( set /p "reinstall=Изменений не внесено. Желаете переустановить? [Y/Д] нет по умолчанию: " if /i "!reinstall!"=="Y" ( goto clear_installation ) else ( if /i "!reinstall!"=="Д" (goto clear_installation) ) goto end ) else ( echo [✔️] Установка завершена pause goto end ) :clear_installation set /p "reinstall_python=Скачать Python и пакеты заново? [Y/Д] нет по умолчанию: " if /i "!reinstall_python!"=="Y" ( goto del_all_python ) else ( if /i "!reinstall_python!"=="Д" (goto del_all_python) ) goto del_only_settings :del_all_python if exist "%python_dir%\7za.exe" (move /y %python_dir%\7za.exe 7za.exe) >nul move /y %python_dir%\7za.exe 7za.exe>nul echo [-] Удаление Python rmdir /s /q %python_dir% goto start :del_only_settings echo [-] Удаление настроек окружения del "%python_dir%\Lib\site-packages\sitecustomize.py" del "%python_dir%\pyvenv.cfg" del "%python_dir%\Scripts\activate.bat" del run_me.bat goto venv_setup :end