ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

pixi:Windows上Python环境管理的新利器,替代conda与venv

pixi:Windows上Python环境管理的新利器,替代conda与venv 在Windows上折腾Python环境可能是很多人的心头之痛。系统自带的Python版本老旧项目A要3.9项目B要3.11装个numpy还能碰上MSVC编译报错卸载重装不是一次两次了。早几年大家靠conda后来用venv加pip但这两个方案一个慢一个散碰到非Python的依赖比如科学计算那套底层库还是一样头疼。我最近把Windows开发机上的环境管理工具换成了pixi用了几周下来这玩意儿确实解决了我在Windows上折腾Python环境的大部分痛点。pixi是prefix.dev团队推出的包管理器和conda一样基于conda生态底层用Rust重新写了一遍所以速度非常快。它的用法很像cargo或pnpm按项目声明依赖生成锁文件保证可复现还能把它当任务运行器用。对Windows用户来说最直观的感受就是装Python、换版本、装包、跑脚本全程干净利落不污染系统也不用再跟PATH变量较劲。这篇东西适合所有在Windows上写Python的人不管是做数据科学、脚本开发还是只想要一个省心的Python环境都值得看完。1. 为什么我放弃了conda和venv改用pixi1.1 现有方案在Windows上到底哪里不顺先聊聊我之前用的几个方案你大概也经历过其中某些场景。conda用Anaconda或Miniconda功能上是全的能管Python版本也能管非Python的库。但体验真的越来越一般创建环境要等解析依赖动不动几分钟conda-forge那一堆channel混在一起的时候有时候装个包要等半天。Windows上还有个老毛病如果用conda create复制一个已有的环境文件多到路径超长中途报错见怪不怪。venv加pip这套组合解决了项目隔离的问题但有个边界很明显——它只管Python包那一层。你的项目如果需要某个C语言写的底层库或者某个系统级工具pip基本帮不上忙。比如装一些涉及图像处理的依赖经常要预装一堆二进制组件装某些带C扩展的包在Windows上得保证VC运行库版本一致否则就是报错地狱。Poetry、uv这些工具我也试过。Poetry的依赖解析思路不错但底层还是PyPI那套遇到非Python的依赖一样没辙。uv本身是个好工具快是真的快但它更偏向取代pip那一层和conda生态不互通有些老库的conda包没法直接用。1.2 pixi的三个核心设计思路pixi的定位简单说就是更快、更现代化、重新设计的conda。它继承conda生态里最值钱的那块也就是能把Python、CUDA、编译器、各种系统库一起管理的能力同时把conda那些恼人的点全换掉。第一命令快。pixi用Rust重写了conda那套包管理逻辑底层解析、下载、解压的动作都做了并行化处理。我在Windows上实测创建一个带Python和pandas的新环境从解析到安装完成大概十几秒以前用conda要两分钟起步。第二项目绑定。pixi不会创建一个“全局的虚拟环境列表”而是每个项目目录里有一个pixi.toml声明文件环境实际放在项目下的.pixi目录里。这跟cargo、npm那种“项目即环境”的模式完全一致。你换一台机器clone下来项目跑一条pixi install就能复现同样的环境。第三锁文件。pixi.lock会自动生成记录所有包的精确版本和下载地址。只要lock文件在任何人安装出来的环境都是一模一样的这在团队协作和部署场景里价值极大。以前和同事对环境问题最怕“我这是好的啊你那边怎么不行”有了lock文件这个问题基本消失。我还想强调一点pixi不是pip的替代品它是一个打包解决方案。项目里的Python包依赖照常用pip或requirement拿到conda里但系统级的东西直接声明在pixi配置里两层互不冲突。这是它比绝大多数工具好用的根本原因。2. Windows上安装pixi并初始化项目2.1 安装方式与配置Windows下安装pixi有三个入口我逐个说下体验。最省事的是wingetwinget install prefix-dev.pixi装完重开一个终端pixi应该就直接能用了。这条命令要求你的Windows 10或11版本不是太老winget的源里收录也较及时。如果winget拉了比较旧的版本手动更新一条pixi self-update就能搞定。第二种是官方PowerShell安装脚本irm pixi.sh/install.ps1 | iex这条命令会下载安装程序并自动配置PATH适合不想用winget的机器。脚本执行完需要重新打开终端生效。第三种是scoop或chocolatey。如果你本来就在用scoop管理Windows开发工具直接scoop install pixi很顺手。我个人推荐优先winget因为对多数人来说它最无脑而且后续升级用winget也能管。装完先跑一条pixi --version确认安装正常。想查看自动生成的配置在用户目录下有一个.pixi目录里面保存全局信息和缓存。到这里pixi本身已经装完接下来我们需要初始化一个项目环境。2.2 pixi init与项目结构创建项目目录或者进入一个已有的项目目录执行pixi init myproject这会在myproject目录下生成两个核心文件pixi.toml和pixi.lock这个初始时是空的同时还会建好.pixi目录。来看一下默认生成的pixi.toml长什么样[project] name myproject version 0.1.0 description Add a description here channels [conda-forge] platforms [win-64] [dependencies]字段都很直观。加粗说一下两个概念channels是包来源默认指向conda-forge这个社区仓库绝大多数Python包都在里面。platforms声明这个项目要支持哪些系统这里是win-64如果你在macOS或Linux上也用这套配置pixi会为每个平台分别解析依赖。如果你不想在终端里记命令pixi其实也有VSCode插件装了之后能直接右键初始化项目、自动补全配置。不过命令行本身已经够简单我觉得插件属于锦上添花。pixi的环境不是放在C盘用户目录那种全局位置而是放在当前项目下的.pixi里。这意味着项目删除环境也就跟着没了不留下任何残留。这个设计和venv其实很像但比venv彻底得多venv只隔离Python库pixi连Python解释器本身也隔离了。2.3 添加Python依赖的核心命令光有项目骨架还不够得让pixi知道我们要什么。先说最常见的装一个指定版本的Python。pixi add python3.11就这么一条命令。pixi会从conda-forge拉取Python 3.11的最新版本同时更新pixi.lock。过一会再看pixi.tomldependencies里会多一行python 3.11.*。如果想装多个包pixi add numpy pandas matplotlib这些包会一起解析解析完成后同时安装。pixi会把它们之间的版本兼容性处理好遇到冲突会直接告诉你哪个包冲突了不会装了个残缺环境。还有一个细节pixi add默认是把包加到dependencies里这是给运行环境用的。开发阶段要的包比如pytest、black、mypy推荐加在dev依赖pixi add --dev pytest blackdev依赖和生产依赖分开在pixi.toml里会体现为独立的[pypi-dependencies]或[dev-dependencies]段这种清晰结构。项目上线部署时只装运行依赖体积和风险都更可控。注意pixi add --dev也不是随便用的它装的是conda包。如果你需要的是某个只在PyPI上的包可以手动在pixi.toml里配置[pypi-dependencies]段或者在命令行的pixi add后跟上包名pixi会自动识别并走PyPI通道。3. 日常实操任务运行、环境切换和依赖快照3.1 把pixi当任务运行器用pixi自带任务系统这是它和conda比体验上最超值的一环。用pixi run可以直接在项目的环境里执行命令不需要手动激活环境。先看最基本的pixi run python main.py这条命令会自动把当前项目环境里的python放到PATH前面来然后执行main.py。你完全不用担心“我激活环境了没”——pixi run在执行时会自动做这件事。这对Windows用户来说尤其省心因为Windows终端环境下激活脚本偶尔会出幺蛾子pixi run绕过了这个环节。多点任务的话在pixi.toml里定义[tasks] start python main.py test pytest tests/ lint ruff check src/写好后直接pixi run start pixi run test任务之间还能串起来比如写一个dev任务依次跑lint和test[tasks] lint ruff check src/ test pytest tests/ dev { depends-on [lint, test] }pixi跑depends-on任务时会按顺序执行。这个功能用来做本地提交前的快速检查非常方便。想新增任务也可以不用手改配置pixi task add build python setup.py build它支持定义多个命令的任务、依赖关系任务还能设置环境变量。Windows端有一个需要心里有数的点pixi在Windows上执行任务时用的是PowerShell或cmd的解析规则和你项目里的shell语法不完全一样。比如设置环境变量在bash里是FOObar在PowerShell里是$env:FOObar。我自己的做法是尽量把复杂命令写成独立的.py或.ps1脚本pixi.toml里只保留一行调用这样跨平台更稳。3.2 环境切换与解释器路径Windows上做Python开发的另一大痛点就是“我到底现在用哪个Python”。用pixi之后这个问题 структура上就被解决了。当前项目的解释器路径永远是项目目录/.pixi/envs/default/python.exe。你可以在pixi.toml里配置多个环境比如一个default环境用于主开发一个test环境用于运行测试。pixi env list可以查看所有环境。切换到某个环境用pixi shell这会启动一个新的终端并且自动进入当前项目的环境。不过说实话我更推荐日常直接用pixi run而不是pixi shell。原因有几个pixi shell在Windows的某些终端组合里比如Windows Terminal PowerShell偶尔不会刷新提示符看着像没进去容易误判而pixi run每次从干净状态执行不依赖当前shell的环境变量行为更可预测。对IDE用户来说配置也不难。VSCode里直接把Python解释器路径指定为.pixi/envs/default/python.exe就行。PyCharm里在项目设置里添加这个解释器路径即可等pixi把环境构建完IDE的代码补全和调试都能直接用。3.3 团队协作与版本复现pixi.lock是pixi的灵魂之一有了它别人clone你的项目后跑一条命令就能得到完全一样的环境。这背后是conda生态的“精确版本锁定”能力和pixi的解析机制在起作用。共享配置比如项目里用了哪些depends-on环境变量写在pixi.toml精确到版本的锁定在pixi.lock两个文件一起提交到版本库。队友clone之后执行pixi installpixi会读取pixi.toml和pixi.lock按锁定的版本安装所有依赖不会因为某个包发新版就产生环境漂移。多平台项目也支持得不错。比如项目里有这样的配置[target.win-64.dependencies] pywin32 * [target.linux-64.dependencies] libgl *这样Windows上会自动包含pywin32Linux上包含libgl而默认的dependencies部分两边共享。pixi解析lock时会把每个平台的解析结果分别记录同一份清单可以在Windows、macOS、Linux复现。这里说一下我踩过的一次实际教训。有次我在Windows上往pixi.toml里加了Linux才有的依赖pixi add是成功的因为某些包在不同平台上都能解析到但队友在Linux上跑pixi install时发现Conda解算特别慢。后来发现是因为windows平台解析和linux平台解析混在同一个lock文件里导致解析复杂度上升。我的经验是日常开发还是让pixi自动管理lock文件比较省心不要频繁手动改pixi.toml里跟平台相关的字段跨平台需求的解析让pixi自己处理最多手工改一下platforms列表。4. Windows上的常见坑与排查方法4.1 路径、缓存和shell带来的问题Windows上的第一个老问题是路径过长。pixi环境在项目目录的.pixi里如果项目路径本身就很长比如一层层文件夹嵌套再加上conda包里那些深层目录结构容易触发Windows的MAX_PATH限制。我吃过几次亏后养成的习惯是项目目录尽量放在C盘或D盘根目录附近像D:\projects\myproject这种不要来回嵌套。如果公司内网或磁盘上确实有路径限制可以给项目目录开长路径支持注册表里启用LongPathsEnabled但最好从源头避免。第二个常见问题是pixi shell的奇怪表现。Windows Terminal里用pixi shell之后提示符前面不会出现很多教程里展示的“(myproject)”前缀导致有些人以为激活失败。实际检查方法很简单在shell里执行where python如果指向项目下的.pixi\envs\default\python.exe就是成功了。第三个问题是缓存。conda的缓存目录在用户目录下pixi类似也会缓存下载的包和repodata。用久了缓存会占掉几个GB特别是经常切换Python版本的项目。清理命令pixi clean这个命令会把缓存和临时文件清掉不会影响已经创建好的环境。如果遇到下载的包损坏、安装报校验错误也可以用pixi clean后再pixi install重新安装。4.2 包安装失败的排查思路pixi安装包失败通常有这么几种表现我来记一个排查顺序。第一步看完整报错。pixi默认的报错信息不算冗长但有时候会被提示语遮住细节。加verbose参数跑一次pixi install --verbose第二步看网络。pixi默认从conda-forge拉取repodata网络不稳定时表现是解析阶段卡住或者下载中断。Windows上如果有系统代理像公司上网环境这类给pixi配代理环境变量即可位置在用户环境变量里。如果网络实在不好可以换成镜像站具体渠道按你实际网络情况来。第三步看repodata的缓存。pixi会把远程的repodata缓存在本地如果缓存没刷干净有时候会出现“明明包已经发了新版但pixi一直解析到旧版”的问题。此时执行pixi clean --repodata再回去pixi install。第四步看依赖冲突。pixi的输出里如果出现package xxx conflicts with xxx的提示说明你手动加的两个包本身依赖不兼容。这类问题不是pixi的bug而是包生态本身的问题。我的建议是把有冲突的包分开装到不同dev依赖里或者借助conda-forge上已有的兼容构建来绕过比如等pixi给出它建议的channel组合再试一次。4.3 不要拿pixi干的事情写几个我自己差点踩进去的场景算是边界提醒。不要用pip安装Python解释器本身。pixi管理Python解释器但如果你在pixi环境里运行pip install python会把pip包当作Python包处理一团乱。要改Python版本永远用pixi add python...。不要把pixi add当pip install用。遇到项目需要临时引入一个包调试直接pixi add会把包写进pixi.toml并改变lock文件。临时实验可以用pixi exec这个命令在临时环境里装包跑命令不会污染当前项目的配置和lock。后面我会细讲。pixi环境里的pip别乱装包。pixi环境里确实自带了pip但你在环境里pip install的包和pixi.lock没有关系。如果用了pip装包另一个队友执行pixi install时不会自动带上这些包环境就悄悄漂移了。团队协作时要么全用pixi add要么明确约定用pypi-dependencies段并一起维护lock。5. 进阶pixi global、pixi exec和跨平台用法5.1 用pixi global管理全局工具日常开发里我们经常需要一些全局可用的Python命令行工具比如black、flake8、jupyter等。传统做法是用pip装到全局Python里久而久之全局环境就脏了。pixi提供global命令解决这个问题pixi global install black pixi global install ruff jupyter这样装的工具放在pixi自己的全局位置不会污染你的系统Python。命令行直接敲black、ruff就能用不需要激活任何环境。一条个人经验pixi global装工具时如果没有指定版本默认拉最新但有些命令行工具的最新版可能和稳定版有兼容差异。我一般直接指定版本号比如pixi global install black24.2.0装完至少一年半载不会因为自动升级出幺蛾子。5.2 用pixi exec做一次性任务有些场景我不想动当前项目配置只是想快速用一个环境跑个脚本。比如我有个临时脚本要用pandas处理一个CSV但当前项目里没有pandas。这时候pixi exec --with pandas python my_script.pypixi会临时拉一个含pandas的环境跑完自动丢弃。这个和npx的用法很像做个临时的验证环境极其顺手。我还经常拿它测不同Python版本的兼容性pixi exec --python 3.10 --with numpy python -c import numpy; print(numpy.__version__)一条命令换一个Python版本比开多个conda环境再切换快太多。5.3 在CI和Docker里复用pixi环境Windows上搭建的开发环境最终部署也常涉及Linux服务器。pixi的lock文件可以同时锁定多平台这就让“开发在Windows、部署在Linux”的流程顺滑很多。一个典型做法是Dockerfile里这样写FROM ghcr.io/prefix-dev/ubuntu:latest COPY pixi.toml pixi.lock . RUN pixi install构建时会按照lock文件精确保留依赖版本不会像某些镜像构建那样过两天环境就变了。配合多平台targetWindows上开发的依赖和Linux上部署的依赖可以在同一个pixi.toml里声明不用维护两套环境配置文件。如果你用CI平台跑测试思路一样先把pixi安装到CI环境里然后pixi install接着pixi run test。因为pixi run会自动处理好环境变量和解释器路径CI脚本写起来很干净。6. 写在最后的一点个人体会用pixi管理Windows上的Python环境给我最直观的变化是把“环境配置”这件事从玄学变成了工程化操作。以前处理环境问题的时间是按小时算的现在基本就是改几行toml、跑几条命令的事。pixi.project文件加锁文件这套组合让我在来回切换项目、重装电脑、换机器这些场景里几乎不用再花时间调环境。如果让我给你一个落地方案先用winget把pixi装上找个测试项目pixi init然后pixi add python3.11接着pixi run python --version先跑通最核心的那条链路。后面再逐步把常用的全局工具挪到pixi global里把项目里的复杂命令整理成tasks最后再考虑把CI和Docker流程切过来。整个过程分几步做每一步都能立刻看到效果不会出现“配了半天最后全炸了”的情况。Windows过去在Python生态里的地位一直有点别扭而pixi这种基于conda生态但体验现代化的工具算是把这层别扭削去了一大半。希望这篇东西对你有用你要是也在Windows上折腾Python环境不妨试试。
返回列表