Запуск python напрямую вместо обёртки run.ps1
Профиль Windows Terminal вызывает .venv\Scripts\python.exe с PYTHONUTF8=1 в окружении профиля, поэтому промежуточный PowerShell и его настройка консоли больше не нужны.
This commit is contained in:
@@ -15,8 +15,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|||||||
|
|
||||||
## Команды
|
## Команды
|
||||||
|
|
||||||
|
Запускать нужно интерпретатором из `.venv` — textual стоит там:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python pg_stand_sync.py # TUI-пульт (основной режим)
|
.venv/Scripts/python.exe pg_stand_sync.py # TUI-пульт (основной режим)
|
||||||
python pg_stand_sync.py --no-tui # то же текстовым меню
|
python pg_stand_sync.py --no-tui # то же текстовым меню
|
||||||
python pg_stand_sync.py list # базы стенда — самая быстрая проверка связи
|
python pg_stand_sync.py list # базы стенда — самая быстрая проверка связи
|
||||||
python pg_stand_sync.py --dry-run sync DB # печатает все команды, к серверам не ходит
|
python pg_stand_sync.py --dry-run sync DB # печатает все команды, к серверам не ходит
|
||||||
|
|||||||
@@ -12,20 +12,20 @@
|
|||||||
copy config.example.json config.json
|
copy config.example.json config.json
|
||||||
```
|
```
|
||||||
|
|
||||||
```powershell
|
|
||||||
.\run.ps1 -Setup
|
|
||||||
```
|
|
||||||
|
|
||||||
Заполнить `source` (стенд) и `target` (локальная PG), затем:
|
Заполнить `source` (стенд) и `target` (локальная PG), затем:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\run.ps1
|
.venv\Scripts\python.exe pg_stand_sync.py
|
||||||
```
|
```
|
||||||
|
|
||||||
`run.ps1` — обёртка запуска: берёт интерпретатор из `.venv` (иначе системный), переключает
|
Окружение создаётся один раз:
|
||||||
консоль в UTF-8 и пробрасывает остальные аргументы в скрипт (`.\run.ps1 list`,
|
|
||||||
`.\run.ps1 --dry-run sync zpas`). `-Setup` создаёт окружение и ставит зависимости,
|
```powershell
|
||||||
`-Tests` прогоняет тесты. Без обёртки всё то же работает через `python pg_stand_sync.py`.
|
python -m venv .venv; .venv\Scripts\python.exe -m pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
В Windows Terminal заведён профиль **Tools → pg-stand-sync**: он вызывает
|
||||||
|
`.venv\Scripts\python.exe pg_stand_sync.py` напрямую, с `PYTHONUTF8=1` в окружении профиля.
|
||||||
|
|
||||||
Откроется пульт: оба списка сразу на экране, отдельного шага «выбор действия» нет.
|
Откроется пульт: оба списка сразу на экране, отдельного шага «выбор действия» нет.
|
||||||
|
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Запуск pg-stand-sync: находит интерпретатор, чинит кодировку консоли, пробрасывает аргументы.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
.\run.ps1 # пульт (TUI)
|
|
||||||
.\run.ps1 list # базы на стенде
|
|
||||||
.\run.ps1 --dry-run sync zpas # проверка команд без выполнения
|
|
||||||
.\run.ps1 -Setup # создать .venv и поставить зависимости
|
|
||||||
.\run.ps1 -Tests # прогнать тесты
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param(
|
|
||||||
# Создать .venv и установить requirements.txt
|
|
||||||
[switch]$Setup,
|
|
||||||
# Прогнать tests_tui.py вместо запуска приложения
|
|
||||||
[switch]$Tests,
|
|
||||||
# Всё остальное уходит в pg_stand_sync.py как есть
|
|
||||||
[Parameter(ValueFromRemainingArguments = $true)]
|
|
||||||
[string[]]$Rest
|
|
||||||
)
|
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
|
||||||
$root = $PSScriptRoot
|
|
||||||
$venvPython = Join-Path $root '.venv\Scripts\python.exe'
|
|
||||||
|
|
||||||
# Русский лог и рамки Textual в cp866-консоли превращаются в мусор
|
|
||||||
[Console]::OutputEncoding = [Text.Encoding]::UTF8
|
|
||||||
[Console]::InputEncoding = [Text.Encoding]::UTF8
|
|
||||||
$env:PYTHONIOENCODING = 'utf-8'
|
|
||||||
|
|
||||||
function Find-Python {
|
|
||||||
if (Test-Path $venvPython) { return $venvPython }
|
|
||||||
foreach ($name in 'python', 'py') {
|
|
||||||
$cmd = Get-Command $name -ErrorAction SilentlyContinue
|
|
||||||
if ($cmd) { return $cmd.Source }
|
|
||||||
}
|
|
||||||
throw 'Python не найден: поставьте его или создайте окружение через .\run.ps1 -Setup'
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Setup) {
|
|
||||||
if (-not (Test-Path $venvPython)) {
|
|
||||||
$bootstrap = Find-Python
|
|
||||||
Write-Host "создаю .venv ($bootstrap)" -ForegroundColor Cyan
|
|
||||||
& $bootstrap -m venv (Join-Path $root '.venv')
|
|
||||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
||||||
}
|
|
||||||
Write-Host 'ставлю зависимости' -ForegroundColor Cyan
|
|
||||||
& $venvPython -m pip install --disable-pip-version-check -r (Join-Path $root 'requirements.txt')
|
|
||||||
exit $LASTEXITCODE
|
|
||||||
}
|
|
||||||
|
|
||||||
$python = Find-Python
|
|
||||||
|
|
||||||
if ($Tests) {
|
|
||||||
& $python -m pytest (Join-Path $root 'tests_tui.py') -q @Rest
|
|
||||||
exit $LASTEXITCODE
|
|
||||||
}
|
|
||||||
|
|
||||||
# Без textual приложение молча откатится в текстовое меню — предупредить, пока не поздно
|
|
||||||
& $python -c 'import textual' 2>$null
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Write-Host 'textual не установлен — откроется текстовый режим. Полный пульт: .\run.ps1 -Setup' `
|
|
||||||
-ForegroundColor Yellow
|
|
||||||
}
|
|
||||||
|
|
||||||
& $python (Join-Path $root 'pg_stand_sync.py') @Rest
|
|
||||||
exit $LASTEXITCODE
|
|
||||||
Reference in New Issue
Block a user