python 多版本管理(pyenv)

        上篇文章提到了uv 可以进行 pip 包管理和 虚拟环境构建,其实,对于我们来说,还有一个需求,就是多个python环境进行管理,刚好找了下,发现了这个pyenv工具。话不多少,直接开始。

        pyenv(Windows 下为pyenv-win)是Python 版本管理神器,核心解决「多 Python 版本共存、版本冲突、环境不一致」的痛点,让你在一台电脑上无痛切换不同 Python 版本,不用手动改环境变量、卸载重装,是 Python 开发的必备工具。

       

一、pyenv可以干什么事情?

1.1 多版本 Python 共存(最核心)

        手动管理多个 Python 版本时,你需要反复修改环境变量、记住不同版本的安装路径,极易混乱;而 pyenv 能:

  • 一键安装 Python 2.7/3.6/3.10/3.12 等任意版本(包括 Anaconda、Miniconda、PyPy 等衍生版本);
  • 所有版本隔离存储在~/.pyenv目录(Windows:%USERPROFILE%\.pyenv),互不干扰;
  • 无需卸载现有 Python,系统自带的 Python 也不会被修改 / 覆盖。

1.2. 灵活切换版本(3 种维度,按需选择)

切换维度作用范围适用场景
全局版本整个系统(所有目录)设置系统默认 Python 版本(比如日常开发用 3.10)
局部版本当前目录 + 子目录项目专属版本(比如给 A 项目设 3.9,B 项目设 3.11)
临时版本仅当前终端会话临时测试某个版本(比如快速验证代码在 3.8 下是否兼容)

1.3. 隔离不同版本的依赖包

不同 Python 版本的pip包是完全隔离的,不会出现「装了 3.10 的 Django,3.9 里也能看到」的混乱:

  • 比如 Python 3.8 装Django 4.0,Python 3.10 装Django 5.0,两者互不影响;
  • 解决「升级一个版本的包,导致另一个项目报错」的问题。

1. 4. 无痛安装 / 卸载 Python 版本

不用手动去 Python 官网下载安装包、手动配置路径、担心卸载残留:

  • 安装:一行命令pyenv install 3.10.11,自动下载、安装、配置;
  • 卸载:一行命令pyenv uninstall 3.10.11,彻底删除该版本及对应依赖,无残留;
  • 安装慢?手动下载安装包到缓存目录,pyenv 会自动识别,不用改命令。

二、pyenv安装

windows系统

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"

✨ 如果你已经下载了install-pyenv-win.ps1到 Downloads 目录,直接执行:

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);
  • 配置环境变量(PYENV_ROOTPATH添加binshims路径)。

如果你不能翻墙,脚本下载失败,我这里也有脚本内容,直接保存为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 版本(*标记当前生效版本):

pyenv versions
4. 切换 Python 版本(核心)

pyenv支持 3 种维度的版本切换,优先级:临时版本 > 局部版本 > 全局版本

(1)全局版本(系统级,所有目录生效)

设置后整个系统默认使用该版本(重启终端生效):

# 示例:设置全局版本为3.10.11 pyenv global 3.10.11 
(2)局部版本(目录级,仅当前目录 / 子目录生效)

针对项目目录单独设置版本(会在目录下生成.python-version文件,提交到 Git 可同步团队版本):

# 进入项目目录 cd C:\Users\juxuan\my_project # 设置局部版本为3.9.18 pyenv local 3.9.18 

👉 取消局部版本:

pyenv local --unset 
(3)临时版本(终端会话级,仅当前终端生效)

仅在当前终端窗口生效,关闭后恢复:

# 示例:临时使用3.8.19 pyenv shell 3.8.19 

👉 取消临时版本:

pyenv shell --unset
5. 验证版本是否生效

设置版本后,执行以下命令确认:

# 查看Python版本(pyenv接管后的版本) python --version # 查看pip版本(对应当前Python) pip --version
6. 卸载指定版本的 Python
# 示例:卸载3.8.19 pyenv uninstall 3.8.19

四、其他常用命令

命令作用
pyenv rehash重新生成版本映射(安装 / 卸载版本后建议执行,避免命令找不到)
pyenv which python查看当前python命令的实际路径
pyenv root查看 pyenv 的安装根目录(Windows 默认:% USERPROFILE%.pyenv)

Read more

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk
48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 「仅过了 48 小时,一笔 8.2 万美元的天价费用凭空出现,较这家小型初创公司的正常月费暴涨近 46000%。」 这不是假设的虚幻故事,而是一家墨西哥初创公司正在经历的真实危机。 近日,一位名为 RatonVaquero 的开发者在 Reddit 发帖求助称,由于他的 Gemini API 密钥被盗用,原本每月仅约 180 美元(约 1242 元)的费用,在短短 48 小时内暴涨到 82,314.44 美元(约 56.8 万元)。对于这家只有三名开发者的小型创业团队来说,这笔突如其来的账单,几乎等同于灭顶之灾。 “我现在整个人都处在震惊和恐慌之中。”RatonVaquero

By Ne0inhk