Python包管理为什么比Node.js的npm难用,如何实现项目级别的依赖管理?
chatgpt 也没给一个实用的方案,你们都是怎么管理自己的 python 环境的?
Python包管理为什么比Node.js的npm难用,如何实现项目级别的依赖管理?
快 2026 了,uv 应该是版本答案了吧
https://docs.astral.sh/uv/
pdm 启用 uv 后端,同时搭配 mise 使用体验更佳
.venv
pycharm 自动管理虚拟环境。
你要不喜欢 ide 就用 pyenv ,设置好之后 cd 进目录自动进项目的虚拟环境。
没用过 conda ,vscode 不是打开项目自己激活环境吗
一直用 venv , conda 太笨重了.
2025 年了,还在用 conda 吗
远一点的 poetry 2018 年就有了, 近一点的 uv 和 pixi, 怎么就难用了
python -m venv .venv
linux:source .venv/bin/active
windows:source .venv/Scripts/active
这很难吗
mise + uv 好用的很
shell 设个短点的 alias 不就行了
昨晚刚刷到的 python 包管理教程,就用 uv 可以了,相当于 npm 的 yarn
每次进入项目都要手动执行一下 conda activate xxx 你就不能装个自动激活环境的程序吗? direnv 了解下
习惯用 venv 了,conda 一直玩不来,太重了
恰恰相反,我就喜欢这种一切尽在掌控的感觉
想切什么环境、当前在什么环境,完全自己说了算
嫌麻烦配命令就好了
就用的 venv ,一个项目一个,比较吃硬盘但是很稳定。
每个项目是独立的环境应该才是正确的做法吧。统一的环境除非你只做单个项目,不然你只要一个项目的依赖出了问题,其余的一定会爆炸
uv 随着大模型的兴起应该算是主流方案了?
UV 有本地梯子还行,上服务器更麻烦了,哎
…venv 不也得激活环境吗 楼上和 conda 有啥区别 楼主不就是嫌麻烦吗
给项目配一下 direnv 实现 shell 自动激活环境。
python 环境管理我用 pixi,能管理 conda 包 和 pypi 包
UV 你值得拥有
自从用 AI 编程,从来没有在命令行输入过 python 相关命令了
windows 下 vscode 打开 terminal 会自动执行:./venv/Scripts/Activate.ps1 ,一进 terminal 就是虚拟环境了,这很好用啊
apt-get 想要什么包都有
从开始学 python 使用自带的 venv 到现在
pyenv ,pix ,pdm ,uv 都用过了,分享一点点心得吧
半自动
1. pyenv: 管理多版本的 python 环境好手,windows 和 ubuntu 中都可以实现方便的多版本切换,但是要注意和其他修改环境变量的程序(比如 ros 机器人开发框架),但是也得科学上网的情况下用,不然容易卡在下载 python 安装包的时候
2. pipx: 这个可以理解是,用来管理用 python 开发和发布的一些工具管理,比如 labelme ,youtube dowload 这类工具,可以独立成一个系统工具(其实还是建立了一个虚拟环境,然后再在这个独立的环境安装了工具,避免污染系统的 pip 环境依赖)
往“全自动”方向发展
3.pdm: 在他之前还有一个 poetry ,能够管 python 一整个开发周期(版本管理、环境管理、依赖管理、打包 whl 分发),pdm 有一点比 uv 方便,他管理的依赖可以跨平台,在写 pyqt 的时候,loguru 模块在 win 和 linux 环境下会到一个 win32ctime 模块,pdm 默默的做了模块区分系统环境的事情,帮我节省了很多(我尝试用 uv 重新管理这个项目,结果出现了模块依赖的问题,uv 好像也有区分的办法,需要自己编写目前,我用得还不熟 XD )
4.uv: 非常快,做的事情和 pdm 、poetry 差不多,也是为了能够管理整个开发周期,还可以做 pipx 做的事情,管理一些开发工具
pdm 、和 uv 一定要注意他们的缓存,空间不够很可能爆目录目录…,
本人也还在摸索和在实际工作中使用,才学疏浅,大佬们指正
python 和 node ,人称依赖管理界的卧龙凤雏。现在 node 说我的 npm 比你好用一万倍,说完自己都笑了。
pyenv 任意 py 版本 再和 uv 配合好了
与其说是 py 的包管理烂,不如说 py 是 C 库的附庸。
py 的所有包管理机制烂的根源就是 .so .dll 不好管理导致的。还有一些逆天玩意是源码分发,你就可劲儿折腾吧。
你觉得 npm 好用,那是因为手没伸到这么长而已。纯 .js 包有啥好管理的。
npm 感觉半斤八两,工具越多的一般越难用,典型的如 pip 和 npm ,人们分别继续开发了 venv ,conda ,yarn ,pnpm…
现在 python 的版本答案是 uv
感觉包管理最好的就是 cargo 了
建议使用 uv
pnpm 已经把 npm 的不足都修正了。现在 pnpm/npm 的问题是,js 生态碎片化,很多简单的功能都要发 npm 包,导致一个项目有成千上万依赖。
#9 可以满足临时的小脚本项目
,如果你依赖多,那么可以用 uv 来管理,在初始化项目的时候安装速度不比 npm 快一万倍?
别提 npm 了,被攻击的生活不能自理了都
venv 呀…以我自己玩的 fastapi 为例
python3 -m venv venv
Makefile 里面写好:
VENV_ACTIVATE = . venv/bin/activate
dev:
写个 tab 在这$(VENV_ACTIVATE) && uvicorn main:app --reload --host 0.0.0.0 --port=3000
然后手动写好 requirements.txt, 执行:
pip install -r requirements.txt
启动的时候跑 make dev 就行了, ctrl c 终结命令的时候, 会自动退出虚拟环境
gpt 竟然没有给你 uv ?这有点出乎我意料
感觉 venv 够用了,一行代码进退环境,遇到新问题再想新办法
windows 开发:官方安装包+venv ,生产环境:pyenv+virtualenv
你说比不上 cargo 我是接受的,说比不上 npm 是不是侮辱性太大了?
试试 devcontainer
python venv 是否 active 相当于 npm 是否-g 参数,npm 默认生成配置文件和使用虚拟环境是个好习惯,python 毕竟设计的比较早算历史问题吧
赞了,主 Java 选手,终于找到了好用的方式,刚才用 gpt 实践了 5 分钟,真的是非常 fast 好用。 类似 npm 这种软件。啥时候有可以管理 jdk 版本的软件,现在就是 8 ,到老也是 8.
npm ?你拿什么做比较不好
pip ,pyenv ,conda ,poetry ,uv ,python 里面一个虚拟环境和包管理也是折腾吐了🤢
conda activate 一下有什么不好吗,明确自己在哪个环境,省的搞混了搞炸了
推荐 mise https://github.com/jdx/mise ,太香了。
uv 工具啊
你用的啥 ide 还需要考虑这个问题? vscode 自动会给项目绑定好虚拟环境啊
可以看看 direnv ,进特定 directory 自动激活
https://github.com/direnv/direnv
uv 无敌好用的
C++的第三方库,能把人折磨死
有请楼下上一张 node_modules 的那张梗图
sdkman
uv
shell 都有 profile ,你可以修改。
conda 不完全是一个纯粹的 python 包管理器,因为它还可以帮你管理非 python 依赖,比如帮你在非系统层面安装各种 lib 库、cuda 、nvcc 等等,不污染本身的系统环境,这一块还是比别的 python 包管理器好不少的
我觉得 conda 挺好用的。。适合本地固定几个环境,但可能会有一堆项目的场景,配合 jupyter 也好用,需要做点数据分析的话很好使。
几乎所有 IDE 进 terminal 都会自动 conda activate ,需要手动敲的时候很少。
部署的话直接 docker ,也就维护个 requirements.txt
uv 也不错,不过我本机开发习惯比较随意一些,一方面项目很多,一方面有时候随便开个目录就开写了,还是喜欢用 conda
uv ,我对 uv 的评价是快到极致。
啥时候 uv 能支持 pnpm 那种全局 store 就好了,不然还是太占空间了。
我这种碎小项目多的 pandas 啥的重复装可受不了。
uv 是支持的,把 [link-mode]( https://docs.astral.sh/uv/reference/settings/#link-mode) 设置成 symlink 就行了,我就是这么用的,能节省不少空间
#46 试试 jbang
conda 太傻逼了,用了小心给你发律师函
> 为什么 Python 的包管理这么难用
因为 Python 生于 1994 年
python 包管理又这么多工具,侧面证明包管理生态太烂了,这么多年发展都没有彻底改变这个状况
请问在集成开发工具下比如 cursor 里可以用吗?
第一次知道这个设置,感谢。
我是 Mac ,看上去默认的 clone 就可以了。
之前不知道 clone 这个模式,看到不是符号链接以为它给复制了。
确实不如 npm 一根毛,有些 body 以为遇到几个要 node-gyp 编译的二进制包就以为是 npm 的全部了,大多数 node 包直接装几秒就装好
#73 二者并不冲突,mise 是通过 shims 自动切换管理你的环境变量来管理环境,现代 ide 一般都能自动检测当前目录下的虚拟环境
你要是觉得切换目录就要切换虚拟环境,可以试一下 direnv
Python包管理与npm的差异主要源于设计哲学和生态系统的不同,但通过现代工具完全可以实现高效的项目级依赖管理。
核心差异分析:
- 环境隔离理念:npm默认在项目级别安装依赖(node_modules),而Python历史上更强调系统级或用户级安装。这导致Python需要额外工具(如venv)来实现隔离。
- 依赖解析机制:npm的扁平化node_modules结构(v3+)与Python的严格层级结构(site-packages)在依赖冲突处理上策略不同。
- 工具成熟度:npm作为Node.js的“官方”包管理器,工具链高度统一。Python历史上存在pip、easy_install、conda等多种工具,现在正通过pip+venv标准化。
现代解决方案推荐:
1. 使用虚拟环境(必备基础)
# 创建虚拟环境
python -m venv .venv
# 激活(Windows)
.venv\Scripts\activate
# 激活(Unix/macOS)
source .venv/bin/activate
# 安装依赖
pip install package_name
2. 依赖声明与管理(关键实践)
# 生成精确的依赖列表
pip freeze > requirements.txt
# 安装所有依赖
pip install -r requirements.txt
# 使用pip-tools进行版本管理
pip install pip-tools
# 编写requirements.in声明主依赖
# 然后编译生成锁定的requirements.txt
pip-compile requirements.in
3. 现代高级工具链
-
Poetry(推荐):一体化解决方案
# 初始化项目 poetry new myproject poetry init # 添加依赖(自动更新pyproject.toml) poetry add requests pandas # 安装所有依赖 poetry install -
PDM:新一代PEP标准工具
pdm init pdm add numpy pdm install
4. 生产环境最佳实践
# 使用多阶段requirements文件
# requirements.in - 主依赖声明
# requirements.txt - 编译后的精确版本(提交到版本控制)
# requirements_dev.txt - 开发工具依赖
# 通过环境变量确保隔离
export PIP_REQUIRE_VIRTUALENV=true
总结建议:
- 新项目首选Poetry,提供最接近npm的体验
- 现有项目使用pip+venv+pip-tools组合
- 务必提交锁定的依赖文件(requirements.txt或poetry.lock)
- 在Docker中直接使用虚拟环境,避免系统污染
Python包管理已从“难用”发展到“专业”,关键在于选择合适的工具链并遵循项目级隔离的最佳实践。与npm的单工具方案不同,Python提供了多种专业化选择,适应不同场景需求。




