python多版本管理方式(pyenv)
上篇文章提到了uv 可以進(jìn)行 pip 包管理和 虛擬環(huán)境構(gòu)建,其實,對于我們來說,還有一個需求,就是多個python環(huán)境進(jìn)行管理,剛好找了下,發(fā)現(xiàn)了這個pyenv工具。話不多少,直接開始。
pyenv(Windows 下為pyenv-win)是Python 版本管理神器,核心解決「多 Python 版本共存、版本沖突、環(huán)境不一致」的痛點,讓你在一臺電腦上無痛切換不同 Python 版本,不用手動改環(huán)境變量、卸載重裝,是 Python 開發(fā)的必備工具。
一、pyenv可以干什么事情?
1.1 多版本 Python 共存(最核心)
手動管理多個 Python 版本時,你需要反復(fù)修改環(huán)境變量、記住不同版本的安裝路徑,極易混亂;而 pyenv 能:
- 一鍵安裝 Python 2.7/3.6/3.10/3.12 等任意版本(包括 Anaconda、Miniconda、PyPy 等衍生版本);
- 所有版本隔離存儲在
~/.pyenv目錄(Windows:%USERPROFILE%\.pyenv),互不干擾; - 無需卸載現(xiàn)有 Python,系統(tǒng)自帶的 Python 也不會被修改 / 覆蓋。
1.2. 靈活切換版本(3 種維度,按需選擇)
| 切換維度 | 作用范圍 | 適用場景 |
|---|---|---|
| 全局版本 | 整個系統(tǒng)(所有目錄) | 設(shè)置系統(tǒng)默認(rèn) Python 版本(比如日常開發(fā)用 3.10) |
| 局部版本 | 當(dāng)前目錄 + 子目錄 | 項目專屬版本(比如給 A 項目設(shè) 3.9,B 項目設(shè) 3.11) |
| 臨時版本 | 僅當(dāng)前終端會話 | 臨時測試某個版本(比如快速驗證代碼在 3.8 下是否兼容) |
1.3. 隔離不同版本的依賴包
不同 Python 版本的pip包是完全隔離的,不會出現(xiàn)「裝了 3.10 的 Django,3.9 里也能看到」的混亂:
- 比如 Python 3.8 裝
Django 4.0,Python 3.10 裝Django 5.0,兩者互不影響; - 解決「升級一個版本的包,導(dǎo)致另一個項目報錯」的問題。
1. 4. 無痛安裝 / 卸載 Python 版本
不用手動去 Python 官網(wǎng)下載安裝包、手動配置路徑、擔(dān)心卸載殘留:
- 安裝:一行命令
pyenv install 3.10.11,自動下載、安裝、配置; - 卸載:一行命令
pyenv uninstall 3.10.11,徹底刪除該版本及對應(yīng)依賴,無殘留; - 安裝慢?手動下載安裝包到緩存目錄,pyenv 會自動識別,不用改命令。
二、pyenv安裝
windows系統(tǒng)
powershell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -UseBasicParsing -Uri https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1 -OutFile install-pyenv-win.ps1; .\install-pyenv-win.ps1"
如果你已經(jīng)下載了install-pyenv-win.ps1到 Downloads 目錄,直接執(zhí)行:
cd C:\Users\juxuan\Downloads powershell -ExecutionPolicy Bypass -File .\install-pyenv-win.ps1
腳本會自動:
- 將 pyenv-win 安裝到
%USERPROFILE%\.pyenv\pyenv-win(即C:\Users\juxuan\.pyenv\pyenv-win); - 配置環(huán)境變量(
PYENV_ROOT、PATH添加bin和shims路徑)。
如果你不能翻.墻,腳本下載失敗,我這里也有腳本內(nèi)容,直接保存為install-pyenv-win.ps1。
<#
.SYNOPSIS
Installs pyenv-win
.DESCRIPTION
Installs pyenv-win to $HOME\.pyenv
If pyenv-win is already installed, try to update to the latest version.
.PARAMETER Uninstall
Uninstall pyenv-win. Note that this uninstalls any Python versions that were installed with pyenv-win.
.INPUTS
None.
.OUTPUTS
None.
.EXAMPLE
PS> install-pyenv-win.ps1
.LINK
Online version: https://pyenv-win.github.io/pyenv-win/
#>
param (
[Switch] $Uninstall = $False
)
$PyEnvDir = "${env:USERPROFILE}\.pyenv"
$PyEnvWinDir = "${PyEnvDir}\pyenv-win"
$BinPath = "${PyEnvWinDir}\bin"
$ShimsPath = "${PyEnvWinDir}\shims"
Function Remove-PyEnvVars() {
$PathParts = [System.Environment]::GetEnvironmentVariable('PATH', "User") -Split ";"
$NewPathParts = $PathParts.Where{ $_ -ne $BinPath }.Where{ $_ -ne $ShimsPath }
$NewPath = $NewPathParts -Join ";"
[System.Environment]::SetEnvironmentVariable('PATH', $NewPath, "User")
[System.Environment]::SetEnvironmentVariable('PYENV', $null, "User")
[System.Environment]::SetEnvironmentVariable('PYENV_ROOT', $null, "User")
[System.Environment]::SetEnvironmentVariable('PYENV_HOME', $null, "User")
}
Function Remove-PyEnv() {
Write-Host "Removing $PyEnvDir..."
If (Test-Path $PyEnvDir) {
Remove-Item -Path $PyEnvDir -Recurse
}
Write-Host "Removing environment variables..."
Remove-PyEnvVars
}
Function Get-CurrentVersion() {
$VersionFilePath = "$PyEnvDir\.version"
If (Test-Path $VersionFilePath) {
$CurrentVersion = Get-Content $VersionFilePath
}
Else {
$CurrentVersion = ""
}
Return $CurrentVersion
}
Function Get-LatestVersion() {
$LatestVersionFilePath = "$PyEnvDir\latest.version"
(New-Object System.Net.WebClient).DownloadFile("https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/.version", $LatestVersionFilePath)
$LatestVersion = Get-Content $LatestVersionFilePath
Remove-Item -Path $LatestVersionFilePath
Return $LatestVersion
}
Function Main() {
If ($Uninstall) {
Remove-PyEnv
If ($? -eq $True) {
Write-Host "pyenv-win successfully uninstalled."
}
Else {
Write-Host "Uninstallation failed."
}
exit
}
$BackupDir = "${env:Temp}/pyenv-win-backup"
$CurrentVersion = Get-CurrentVersion
If ($CurrentVersion) {
Write-Host "pyenv-win $CurrentVersion installed."
$LatestVersion = Get-LatestVersion
If ($CurrentVersion -eq $LatestVersion) {
Write-Host "No updates available."
exit
}
Else {
Write-Host "New version available: $LatestVersion. Updating..."
Write-Host "Backing up existing Python installations..."
$FoldersToBackup = "install_cache", "versions", "shims"
ForEach ($Dir in $FoldersToBackup) {
If (-not (Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir
}
Move-Item -Path "${PyEnvWinDir}/${Dir}" -Destination $BackupDir
}
Write-Host "Removing $PyEnvDir..."
Remove-Item -Path $PyEnvDir -Recurse
}
}
New-Item -Path $PyEnvDir -ItemType Directory
$DownloadPath = "$PyEnvDir\pyenv-win.zip"
(New-Object System.Net.WebClient).DownloadFile("https://github.com/pyenv-win/pyenv-win/archive/master.zip", $DownloadPath)
Start-Process -FilePath "powershell.exe" -ArgumentList @(
"-NoProfile",
"-Command `"Microsoft.PowerShell.Archive\Expand-Archive -Path \`"$DownloadPath\`" -DestinationPath \`"$PyEnvDir\`"`""
) -NoNewWindow -Wait
Move-Item -Path "$PyEnvDir\pyenv-win-master\*" -Destination "$PyEnvDir"
Remove-Item -Path "$PyEnvDir\pyenv-win-master" -Recurse
Remove-Item -Path $DownloadPath
# Update env vars
[System.Environment]::SetEnvironmentVariable('PYENV', "${PyEnvWinDir}\", "User")
[System.Environment]::SetEnvironmentVariable('PYENV_ROOT', "${PyEnvWinDir}\", "User")
[System.Environment]::SetEnvironmentVariable('PYENV_HOME', "${PyEnvWinDir}\", "User")
$PathParts = [System.Environment]::GetEnvironmentVariable('PATH', "User") -Split ";"
# Remove existing paths, so we don't add duplicates
$NewPathParts = $PathParts.Where{ $_ -ne $BinPath }.Where{ $_ -ne $ShimsPath }
$NewPathParts = ($BinPath, $ShimsPath) + $NewPathParts
$NewPath = $NewPathParts -Join ";"
[System.Environment]::SetEnvironmentVariable('PATH', $NewPath, "User")
If (Test-Path $BackupDir) {
Write-Host "Restoring Python installations..."
Move-Item -Path "$BackupDir/*" -Destination $PyEnvWinDir
}
If ($? -eq $True) {
Write-Host "pyenv-win is successfully installed. You may need to close and reopen your terminal before using it."
}
Else {
Write-Host "pyenv-win was not installed successfully. If this issue persists, please open a ticket: https://github.com/pyenv-win/pyenv-win/issues."
}
}
Main
三、pyenv使用方法
1. 查看可安裝的 Python 版本
列出所有官方可安裝的 Python 版本(含 3.x、2.x、anaconda 等):
pyenv install --list # 簡寫:pyenv install -l
篩選常用版本(比如只看 3.10 開頭):
pyenv install -l | findstr "3.10" # Windows # pyenv install -l | grep "3.10" # Linux/macOS
2. 安裝指定版本的 Python
# 示例:安裝Python 3.10.11 pyenv install 3.10.11
3. 查看已安裝的 Python 版本
列出本地所有已安裝的 Python 版本(*標(biāo)記當(dāng)前生效版本):
pyenv versions
4. 切換 Python 版本(核心)
pyenv支持 3 種維度的版本切換,優(yōu)先級:臨時版本 > 局部版本 > 全局版本。
(1)全局版本(系統(tǒng)級,所有目錄生效)
設(shè)置后整個系統(tǒng)默認(rèn)使用該版本(重啟終端生效):
# 示例:設(shè)置全局版本為3.10.11 pyenv global 3.10.11
(2)局部版本(目錄級,僅當(dāng)前目錄 / 子目錄生效)
針對項目目錄單獨設(shè)置版本(會在目錄下生成.python-version文件,提交到 Git 可同步團(tuán)隊版本):
# 進(jìn)入項目目錄 cd C:\Users\juxuan\my_project # 設(shè)置局部版本為3.9.18 pyenv local 3.9.18
取消局部版本:
pyenv local --unset
(3)臨時版本(終端會話級,僅當(dāng)前終端生效)
僅在當(dāng)前終端窗口生效,關(guān)閉后恢復(fù):
# 示例:臨時使用3.8.19 pyenv shell 3.8.19
取消臨時版本:
pyenv shell --unset
5. 驗證版本是否生效
設(shè)置版本后,執(zhí)行以下命令確認(rèn):
# 查看Python版本(pyenv接管后的版本) python --version # 查看pip版本(對應(yīng)當(dāng)前Python) pip --version
6. 卸載指定版本的 Python
# 示例:卸載3.8.19 pyenv uninstall 3.8.19
四、其他常用命令
| 命令 | 作用 |
|---|---|
| pyenv rehash | 重新生成版本映射(安裝 / 卸載版本后建議執(zhí)行,避免命令找不到) |
| pyenv which python | 查看當(dāng)前python命令的實際路徑 |
| pyenv root | 查看 pyenv 的安裝根目錄(Windows 默認(rèn):% USERPROFILE%.pyenv) |
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python opencv實現(xiàn)圖片旋轉(zhuǎn)矩形分割
這篇文章主要為大家詳細(xì)介紹了python opencv實現(xiàn)圖片旋轉(zhuǎn)矩形分割,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
如何基于Python + requests實現(xiàn)發(fā)送HTTP請求
這篇文章主要介紹了如何基于Python + requests實現(xiàn)發(fā)送HTTP請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01

