#!/bin/bash # Настройки SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PYTHON_DIR="$SCRIPT_DIR/python312" PYTHON_URL="https://github.com/astral-sh/python-build-standalone/releases/download/20250612/cpython-3.12.11+20250612-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz" PYTHON_EXE="$PYTHON_DIR/bin/python3.12" # Цвета GREEN='\033[32m' YELLOW='\033[33m' RED='\033[31m' NC='\033[0m' echo_color() { echo -e "${1}${2}${NC}" } run_cmd() { if ! eval "$1"; then echo_color "$RED" "[-] Ошибка выполнения: $1" exit 1 fi } # Проверка, установлен ли Python if [[ -f "$PYTHON_EXE" ]]; then echo_color "$GREEN" "[ ] Python уже установлен" "$PYTHON_EXE" --version else echo_color "$YELLOW" "[*] Установка Python..." mkdir -p "$PYTHON_DIR" || { echo_color "$RED" "[-] Ошибка создания папки $PYTHON_DIR" exit 1 } curl -L -o python.tar.gz "$PYTHON_URL" || { echo_color "$RED" "[-] Ошибка загрузки Python" exit 1 } tar --strip-components=1 -xzf python.tar.gz -C "$PYTHON_DIR" || { echo_color "$RED" "[-] Ошибка распаковки" rm -f python.tar.gz exit 1 } rm -f python.tar.gz # Ссылка для удобства ln -sf python3.12 "$PYTHON_DIR/bin/python" echo_color "$GREEN" "[+] Python установлен" # Установка pip echo_color "$YELLOW" "[*] Установка pip" curl -L -o get-pip.py 'https://bootstrap.pypa.io/get-pip.py' || { echo_color "$RED" "[-] Не удалось скачать get-pip.py" exit 1 } "$PYTHON_EXE" get-pip.py --no-warn-script-location || { echo_color "$RED" "[-] Ошибка установки pip" rm -f get-pip.py exit 1 } rm -f get-pip.py # Обновление базовых пакетов echo_color "$YELLOW" "[*] Обновление pip, setuptools, wheel" "$PYTHON_EXE" -m pip install --upgrade pip setuptools wheel --no-cache-dir || { echo_color "$RED" "[-] Ошибка обновления" exit 1 } # Установка requirements.txt if [[ -f "$SCRIPT_DIR/requirements.txt" ]]; then echo_color "$YELLOW" "[*] Установка зависимостей" "$PYTHON_EXE" -m pip install -r "$SCRIPT_DIR/requirements.txt" --no-cache-dir || { echo_color "$RED" "[-] Ошибка при установке пакетов" exit 1 } fi fi # === Создание run_me.sh (без запуска!) === RUN_ME="$SCRIPT_DIR/run_me.sh" if [[ -f "$RUN_ME" ]]; then echo_color "$GREEN" "[ ] run_me.sh уже существует" else echo_color "$YELLOW" "[+] Создание run_me.sh" cat > "$RUN_ME" << 'EOF' #!/bin/bash cd "$(dirname "$0")" source python312/bin/activate python main.py EOF chmod +x "$RUN_ME" echo_color "$GREEN" "[✔] run_me.sh создан" fi # === Создание activate и pyvenv.cfg === ACTIVATE_SCRIPT="$PYTHON_DIR/bin/activate" PYVENV_CFG="$PYTHON_DIR/pyvenv.cfg" SITE_PACKAGES="$PYTHON_DIR/lib/python3.12/site-packages" mkdir -p "$PYTHON_DIR/bin" "$SITE_PACKAGES" # sitecustomize.py cat > "$SITE_PACKAGES/sitecustomize.py" << 'EOF' import site import os import sys virtual_env = os.getenv("VIRTUAL_ENV") if virtual_env: sys.prefix = virtual_env sys.exec_prefix = virtual_env def getsitepackages(): return [os.path.join(virtual_env, "lib", "python3.12", "site-packages")] site.getsitepackages = getsitepackages EOF # pyvenv.cfg cat > "$PYVENV_CFG" << EOF home = $SCRIPT_DIR/python312 include-system-site-packages = false version = 3.12.11 executable = $PYTHON_DIR/bin/python3.12 command = $PYTHON_DIR/bin/python3.12 EOF # activate cat > "$ACTIVATE_SCRIPT" << 'EOF' #!/bin/bash export VIRTUAL_ENV="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" export VIRTUAL_ENV_PROMPT=$(basename "$VIRTUAL_ENV") export _OLD_VIRTUAL_PATH="$PATH" export PATH="$VIRTUAL_ENV/bin:$PATH" unset PYTHONHOME export PS1="($VIRTUAL_ENV_PROMPT) $PS1" EOF chmod +x "$ACTIVATE_SCRIPT" echo_color "$GREEN" "[✔️] Установка завершена. Запуск через rum-me.sh"