windows:portable_tools:python:start
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| windows:portable_tools:python:start [2026/05/14 12:00] – | windows:portable_tools:python:start [2026/05/14 12:06] (текущий) – | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Python ====== | ====== Python ====== | ||
| - | Python Embeded\\ | + | ===== Python Embeded |
| необходимо на чистую\\ | необходимо на чистую\\ | ||
| - | Python | + | Python\\ |
| - | '' | + | '' |
| - | |- Lib\site-packages\setuptools\\\ | + | '' |
| - | |- Lib\site-packages\wheel\\\ | + | '' |
| + | '' | ||
| + | |||
| + | ==== Проверка на соответствие ==== | ||
| + | |||
| + | <code powershell python_env_check.ps1> | ||
| + | # ========================================= | ||
| + | # File: python_env_check.ps1 | ||
| + | # ========================================= | ||
| + | # DESCRIPTION: | ||
| + | # | ||
| + | # | ||
| + | # FEATURES: | ||
| + | # - Checks: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # pip | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # - Displays: | ||
| + | # | ||
| + | # | ||
| + | # Pip version | ||
| + | # | ||
| + | # | ||
| + | # USAGE: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # NOTES: | ||
| + | # | ||
| + | # | ||
| + | # EXAMPLE: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # ========================================= | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # UTF-8 Console | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | [Console]:: | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Helper Functions | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | function Write-Status { | ||
| + | param ( | ||
| + | [string]$Status, | ||
| + | [string]$Message | ||
| + | ) | ||
| + | |||
| + | switch ($Status) { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | default { $color = " | ||
| + | } | ||
| + | |||
| + | Write-Host (" | ||
| + | Write-Host $Message | ||
| + | } | ||
| + | |||
| + | function Test-WritableDirectory { | ||
| + | param ( | ||
| + | [string]$Path | ||
| + | ) | ||
| + | |||
| + | try { | ||
| + | $testFile = Join-Path $Path " | ||
| + | |||
| + | " | ||
| + | |||
| + | if (Test-Path $testFile) { | ||
| + | Remove-Item $testFile -Force -ErrorAction SilentlyContinue | ||
| + | return $true | ||
| + | } | ||
| + | |||
| + | return $false | ||
| + | } | ||
| + | catch { | ||
| + | return $false | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Root Paths | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if ($args.Count -ge 1) { | ||
| + | |||
| + | $RootDir = $args[0] | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path | ||
| + | |||
| + | $RootDir = Join-Path $ScriptDir " | ||
| + | } | ||
| + | |||
| + | $RootDir = [System.IO.Path]:: | ||
| + | |||
| + | $PythonExe = Join-Path $RootDir " | ||
| + | $LauncherPath = Join-Path $RootDir " | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | Write-Host $RootDir | ||
| + | Write-Host "" | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Header | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | Write-Host " Portable Python Environment Checker" | ||
| + | Write-Host " | ||
| + | Write-Host "" | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check python.exe | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if (Test-Path $PythonExe) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | |||
| + | Write-Host "" | ||
| + | Read-Host "Press Enter" | ||
| + | exit | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Find pythonXY._pth | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $PthFile = Get-ChildItem -Path $RootDir -Filter " | ||
| + | |||
| + | if ($PthFile) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check import site | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if ($PthFile) { | ||
| + | |||
| + | $PthContent = Get-Content $PthFile.FullName -ErrorAction SilentlyContinue | ||
| + | |||
| + | $ImportSiteEnabled = $false | ||
| + | |||
| + | foreach ($line in $PthContent) { | ||
| + | |||
| + | $trim = $line.Trim() | ||
| + | |||
| + | if ($trim -eq " | ||
| + | $ImportSiteEnabled = $true | ||
| + | } | ||
| + | } | ||
| + | |||
| + | if ($ImportSiteEnabled) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Python Version | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $PythonVersion = & $LauncherPath --version 2>& | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | catch { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Executable Path | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $ExePath = & $LauncherPath -c " | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | catch { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check pip | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $PipVersion = & $LauncherPath -m pip --version 2>& | ||
| + | |||
| + | if ($LASTEXITCODE -eq 0) { | ||
| + | Write-Status " | ||
| + | Write-Host " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | catch { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check site-packages | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $SitePackages = & $LauncherPath -c " | ||
| + | |||
| + | if ($LASTEXITCODE -eq 0) { | ||
| + | |||
| + | Write-Status " | ||
| + | Write-Host " | ||
| + | |||
| + | if (Test-Path $SitePackages) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | catch { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check user-site | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $UserSite = & $LauncherPath -c " | ||
| + | |||
| + | if ($UserSite -eq " | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | catch { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check User Site Path | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $UserSitePath = & $LauncherPath -c " | ||
| + | |||
| + | if ($UserSite -eq " | ||
| + | |||
| + | Write-Status " | ||
| + | Write-Host " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | Write-Status " | ||
| + | Write-Host " | ||
| + | } | ||
| + | } | ||
| + | catch { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check PYTHONHOME | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if ($env: | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check PYTHONPATH | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if ($env: | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check TEMP Write Access | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $TempDir = Join-Path $RootDir " | ||
| + | |||
| + | if (-not (Test-Path $TempDir)) { | ||
| + | |||
| + | try { | ||
| + | New-Item -ItemType Directory -Path $TempDir -Force | Out-Null | ||
| + | } | ||
| + | catch {} | ||
| + | } | ||
| + | |||
| + | if (Test-WritableDirectory -Path $TempDir) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check Local site-packages Folder | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $LocalSitePackages = Join-Path $RootDir "Lib\site-packages" | ||
| + | |||
| + | if (Test-Path $LocalSitePackages) { | ||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check sys.path | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | |||
| + | & $LauncherPath -c " | ||
| + | } | ||
| + | catch { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Footer | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | Write-Host " Check Complete" | ||
| + | Write-Host " | ||
| + | Write-Host "" | ||
| + | |||
| + | Read-Host "Press Enter" | ||
| + | </ | ||
| + | |||
| + | ==== Исправление ==== | ||
| + | |||
| + | <code powershell python_env_repair.ps1> | ||
| + | # ========================================= | ||
| + | # File: python_env_repair.ps1 | ||
| + | # ========================================= | ||
| + | # DESCRIPTION: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # FEATURES: | ||
| + | # - Verifies portable Python structure | ||
| + | # - Enables " | ||
| + | # - Creates required folders | ||
| + | # - Creates isolated launcher | ||
| + | # - Verifies user-site isolation | ||
| + | # - Displays sys.path | ||
| + | # | ||
| + | # NOTES: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # pip may need to be copied manually | ||
| + | # from another Python installation. | ||
| + | # | ||
| + | # USAGE: | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # ========================================= | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # UTF-8 Console | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | [Console]:: | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Helper Functions | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | function Write-Status { | ||
| + | |||
| + | param ( | ||
| + | [string]$Status, | ||
| + | [string]$Message | ||
| + | ) | ||
| + | |||
| + | switch ($Status) { | ||
| + | |||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | |||
| + | default { $Color = " | ||
| + | } | ||
| + | |||
| + | Write-Host (" | ||
| + | Write-Host $Message | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Root Paths | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if ($args.Count -ge 1) { | ||
| + | |||
| + | $RootDir = $args[0] | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path | ||
| + | |||
| + | $RootDir = Join-Path $ScriptDir " | ||
| + | } | ||
| + | |||
| + | $RootDir = [System.IO.Path]:: | ||
| + | |||
| + | $PythonExe = Join-Path $RootDir " | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Header | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | Write-Host " Portable Python Repair Tool" | ||
| + | Write-Host " | ||
| + | Write-Host "" | ||
| + | |||
| + | Write-Host " | ||
| + | Write-Host $RootDir | ||
| + | Write-Host "" | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Verify python.exe | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | if (-not (Test-Path $PythonExe)) { | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | Write-Host "" | ||
| + | Read-Host "Press Enter" | ||
| + | |||
| + | exit | ||
| + | } | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Find pythonXY._pth | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $PthFile = Get-ChildItem ` | ||
| + | -Path $RootDir ` | ||
| + | -Filter " | ||
| + | -ErrorAction SilentlyContinue | | ||
| + | Select-Object -First 1 | ||
| + | |||
| + | if (-not $PthFile) { | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | Write-Host "" | ||
| + | Read-Host "Press Enter" | ||
| + | |||
| + | exit | ||
| + | } | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Enable import site | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $PthContent = Get-Content $PthFile.FullName | ||
| + | |||
| + | $ImportSiteEnabled = $false | ||
| + | |||
| + | for ($i = 0; $i -lt $PthContent.Count; | ||
| + | |||
| + | $Line = $PthContent[$i].Trim() | ||
| + | |||
| + | if ($Line -eq " | ||
| + | |||
| + | $ImportSiteEnabled = $true | ||
| + | } | ||
| + | |||
| + | if ($Line -eq "# | ||
| + | |||
| + | $PthContent[$i] = " | ||
| + | |||
| + | $ImportSiteEnabled = $true | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | if (-not $ImportSiteEnabled) { | ||
| + | |||
| + | $PthContent += " | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | Set-Content ` | ||
| + | -Path $PthFile.FullName ` | ||
| + | -Value $PthContent ` | ||
| + | -Encoding UTF8 | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Create Required Folders | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $RequiredFolders = @( | ||
| + | " | ||
| + | "Lib\site-packages", | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | foreach ($Folder in $RequiredFolders) { | ||
| + | |||
| + | $FullPath = Join-Path $RootDir $Folder | ||
| + | |||
| + | if (-not (Test-Path $FullPath)) { | ||
| + | |||
| + | New-Item ` | ||
| + | -ItemType Directory ` | ||
| + | -Path $FullPath ` | ||
| + | -Force | Out-Null | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Check pip | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $PipInstalled = $false | ||
| + | |||
| + | try { | ||
| + | |||
| + | & $PythonExe -m pip --version *> $null | ||
| + | |||
| + | if ($LASTEXITCODE -eq 0) { | ||
| + | |||
| + | $PipInstalled = $true | ||
| + | } | ||
| + | } | ||
| + | catch {} | ||
| + | |||
| + | if ($PipInstalled) { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Create py_portable.cmd | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | $LauncherPath = Join-Path $RootDir " | ||
| + | |||
| + | $LauncherContent = @' | ||
| + | :: ======================================== | ||
| + | :: File: py_portable.cmd | ||
| + | :: ======================================== | ||
| + | |||
| + | @echo off | ||
| + | chcp 65001 >nul | ||
| + | |||
| + | setlocal | ||
| + | |||
| + | :: ---------------------------------------- | ||
| + | :: Portable Python Root | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | set " | ||
| + | |||
| + | :: ---------------------------------------- | ||
| + | :: Isolated Environment | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | set " | ||
| + | set " | ||
| + | set " | ||
| + | |||
| + | :: Optional: | ||
| + | :: set " | ||
| + | |||
| + | set " | ||
| + | |||
| + | :: ---------------------------------------- | ||
| + | :: Interactive Mode | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | if " | ||
| + | |||
| + | " | ||
| + | |||
| + | endlocal | ||
| + | exit /b | ||
| + | ) | ||
| + | |||
| + | :: ---------------------------------------- | ||
| + | :: Python -c Support | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | if " | ||
| + | |||
| + | " | ||
| + | |||
| + | endlocal | ||
| + | exit /b | ||
| + | ) | ||
| + | |||
| + | :: ---------------------------------------- | ||
| + | :: Python -m Support | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | if " | ||
| + | |||
| + | " | ||
| + | |||
| + | endlocal | ||
| + | exit /b | ||
| + | ) | ||
| + | :: ---------------------------------------- | ||
| + | :: Script Mode | ||
| + | :: ---------------------------------------- | ||
| + | |||
| + | set " | ||
| + | shift | ||
| + | |||
| + | pushd " | ||
| + | |||
| + | " | ||
| + | |||
| + | popd | ||
| + | |||
| + | endlocal | ||
| + | '@ | ||
| + | |||
| + | Set-Content ` | ||
| + | -Path $LauncherPath ` | ||
| + | -Value $LauncherContent ` | ||
| + | -Encoding ASCII | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Verify user-site isolation | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Status " | ||
| + | |||
| + | try { | ||
| + | |||
| + | $UserSite = & $LauncherPath -c " | ||
| + | |||
| + | if ($UserSite -match " | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | } | ||
| + | catch { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Show user-site path | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | try { | ||
| + | |||
| + | $UserSitePath = & $LauncherPath -c " | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host "User Site Path:" -ForegroundColor Cyan | ||
| + | Write-Host $UserSitePath | ||
| + | } | ||
| + | catch {} | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Show sys.path | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | |||
| + | try { | ||
| + | |||
| + | & $LauncherPath -c " | ||
| + | } | ||
| + | catch { | ||
| + | |||
| + | Write-Status " | ||
| + | } | ||
| + | |||
| + | # ----------------------------------------- | ||
| + | # Footer | ||
| + | # ----------------------------------------- | ||
| + | |||
| + | Write-Host "" | ||
| + | Write-Host " | ||
| + | Write-Host " Repair Complete" | ||
| + | Write-Host " | ||
| + | Write-Host "" | ||
| + | |||
| + | Read-Host "Press Enter" | ||
| + | </ | ||
windows/portable_tools/python/start.1778749257.txt.gz · Последнее изменение: —
