news 2026/9/28 12:59:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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,改用pixi

1.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有三个入口,我逐个说下体验。

最省事的是winget:

winget 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 python=3.11

就这么一条命令。pixi会从conda-forge拉取Python 3.11的最新版本,同时更新pixi.lock。过一会再看pixi.toml,dependencies里会多一行python = "3.11.*"。

如果想装多个包:

pixi add numpy pandas matplotlib

这些包会一起解析,解析完成后同时安装。pixi会把它们之间的版本兼容性处理好,遇到冲突会直接告诉你哪个包冲突了,不会装了个残缺环境。

还有一个细节:pixi add默认是把包加到dependencies里,这是给运行环境用的。开发阶段要的包(比如pytest、black、mypy),推荐加在dev依赖:

pixi add --dev pytest black

dev依赖和生产依赖分开,在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里是FOO=bar,在PowerShell里是$env:FOO="bar"。我自己的做法是尽量把复杂命令写成独立的.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 install

pixi会读取pixi.toml和pixi.lock,按锁定的版本安装所有依赖,不会因为某个包发新版就产生环境漂移。

多平台项目也支持得不错。比如项目里有这样的配置:

[target.win-64.dependencies] pywin32 = "*" [target.linux-64.dependencies] libgl = "*"

这样Windows上会自动包含pywin32,Linux上包含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 black=24.2.0,装完至少一年半载不会因为自动升级出幺蛾子。

5.2 用pixi exec做一次性任务

有些场景我不想动当前项目配置,只是想快速用一个环境跑个脚本。比如我有个临时脚本要用pandas处理一个CSV,但当前项目里没有pandas。这时候:

pixi exec --with pandas python my_script.py

pixi会临时拉一个含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文件精确保留依赖版本,不会像某些镜像构建那样过两天环境就变了。配合多平台target,Windows上开发的依赖和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 python=3.11,接着pixi run python --version,先跑通最核心的那条链路。后面再逐步把常用的全局工具挪到pixi global里,把项目里的复杂命令整理成tasks,最后再考虑把CI和Docker流程切过来。整个过程分几步做,每一步都能立刻看到效果,不会出现“配了半天最后全炸了”的情况。

Windows过去在Python生态里的地位一直有点别扭,而pixi这种基于conda生态但体验现代化的工具,算是把这层别扭削去了一大半。希望这篇东西对你有用,你要是也在Windows上折腾Python环境,不妨试试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 12:59:51

ESP32驱动GC9D01 TFT屏实现动态眼睛动画

1. 项目概述:为什么一只“会转动的眼睛”值得花5分钟折腾?你有没有试过把一块GC9D01屏幕焊在ESP32开发板上,通电后只看到一片灰白——连个“Hello World”都不显示?我第一次接这块屏时也卡了整整两天,烧了三块ESP32-WR…

作者头像 李华
网站建设 2026/9/28 12:57:14

从“无标题”到上线:需求分析、技术选型与MVP落地全流程

“无标题”这三个字,说实话,刚看到这个项目名的时候我愣了一下。但仔细想想,这恰恰是很多项目最真实的状态——需求还没理清、方向还没定死、名字自然也还没想好。这个阶段往往是项目从零到一最混乱、也最容易走偏的时候。这篇东西就是写给正…

作者头像 李华
网站建设 2026/9/28 12:56:58

Flutter鸿蒙适配:at_server_status 去中心化身份监控引擎实战

前阵子接了个挺有意思的活儿:把 Flutter 生态里用于监控 protocol 去中心化身份服务器状态的第三方库 at_server_status 适配到鸿蒙系统上。说实话,接之前我以为这就是改改依赖、跑个 flutter build 的事儿,真正动手才发现,从依赖…

作者头像 李华
网站建设 2026/9/28 12:56:56

nRF52840 Dongle + Wireshark:BLE 空口抓包实战与避坑指南

1. 为什么选择 nRF52840 Dongle 做 BLE 空口抓包搞 BLE 开发的人迟早会碰到一个坎:设备连不上、连接频繁断开、配对失败、数据对不上。代码翻来覆去看不出问题,日志打了一堆也定位不到根因。这时候你需要的不是继续读代码,而是直接看空口上到…

作者头像 李华
网站建设 2026/9/28 12:56:38

爬虫数据落库实战:MySQL/PostgreSQL表设计、索引与Upsert

说实话,爬虫做到第十天,十个人里有八个会开始思考同一个问题:抓下来的数据到底该往哪儿放?CSV文件打开乱码、Excel卡到崩溃、重复数据堆成山,这些我都经历过。搞到后面你会发现,爬虫真正拉开差距的不只是请…

作者头像 李华
网站建设 2026/9/28 12:56:08

YOLOv8扶梯梳齿板异物检测:从训练自己的数据集到可视化界面部署

简介:一套基于YOLOv8的商场自动扶梯梳齿板异物卡滞预警系统完整项目,专门针对扶梯梳齿板异物卡滞场景的实时检测与告警,适用于计算机视觉、深度学习方向的毕业设计、课程设计或初期项目立项,并已跑通完整流程。压缩包共8个文件&am…

作者头像 李华