Python包管理为什么比Node.js的npm难用,如何实现项目级别的依赖管理?

chatgpt 也没给一个实用的方案,你们都是怎么管理自己的 python 环境的?


Python包管理为什么比Node.js的npm难用,如何实现项目级别的依赖管理?
78 回复

快 2026 了,uv 应该是版本答案了吧
https://docs.astral.sh/uv/


pdm 启用 uv 后端,同时搭配 mise 使用体验更佳

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 ,一个项目一个,比较吃硬盘但是很稳定。

function ca(){
conda activate $1
}

每个项目是独立的环境应该才是正确的做法吧。统一的环境除非你只做单个项目,不然你只要一个项目的依赖出了问题,其余的一定会爆炸

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 一定要注意他们的缓存,空间不够很可能爆目录目录…,
本人也还在摸索和在实际工作中使用,才学疏浅,大佬们指正

补充一点,pdm 和 uv 都可以针对特殊的 pytorch 类的包(包括但不限于),专门分配对应的 index
版主应该最容易遇到的是这个问题,和 pytorch 有关的,现在可以参考这两个工具的方案

1. uv 的方案:https://uv.oaix.tech/guides/integration/pytorch/?h=pytorch
2. pdm 的方案: https://pdm-project.org/zh-cn/latest/usage/config/#_5

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 包,导致一个项目有成千上万依赖。

conda 我是一个项目一个 env ,就首次安装的时候 active 一下,也还行

#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++的第三方库,能把人折磨死

目前还在手搓 cmake 的说话了吗

有请楼下上一张 node_modules 的那张梗图

shell 都有 profile ,你可以修改。

可拉倒吧,python 比 node 那套好用一万倍

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的差异主要源于设计哲学和生态系统的不同,但通过现代工具完全可以实现高效的项目级依赖管理。

核心差异分析:

  1. 环境隔离理念:npm默认在项目级别安装依赖(node_modules),而Python历史上更强调系统级或用户级安装。这导致Python需要额外工具(如venv)来实现隔离。
  2. 依赖解析机制:npm的扁平化node_modules结构(v3+)与Python的严格层级结构(site-packages)在依赖冲突处理上策略不同。
  3. 工具成熟度: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

总结建议:

  1. 新项目首选Poetry,提供最接近npm的体验
  2. 现有项目使用pip+venv+pip-tools组合
  3. 务必提交锁定的依赖文件(requirements.txt或poetry.lock)
  4. 在Docker中直接使用虚拟环境,避免系统污染

Python包管理已从“难用”发展到“专业”,关键在于选择合适的工具链并遵循项目级隔离的最佳实践。与npm的单工具方案不同,Python提供了多种专业化选择,适应不同场景需求。

回到顶部