文 | 风筝
来源 | 古时的风筝(ID:gushidefengzheng)
事情是这样的, 前两天看到 Kimi 开源了 Kimi-Cli ,正好在学 Agent,所以就把源码 clone 下来了。
kimi-cli 仓库: https://github.com/MoonshotAI/kimi-cli
但是等我打开项目后,我发现这项目结构和我之前熟悉的项目结构不太一样啊。当我还在习惯性的找 requirements.txt准备安装依赖时,我发现并没有。而是发现了一个 pyproject.toml的配置文件,在这里我看到的 python 版本限制、依赖包,以及其他各种配置时,我才意识到:我 out 了。
转念一想,确实该 out 了,最近几年基本上很少写 Python 代码了,写也是一些特别简单的脚本,根本不用创建项目工程文件。我 out了,说明Python 进步了,好事。
正文开始
我查了一下,这个叫做现代 Python 项目的管理方式,听上去就很现代哈。
正好借助这个项目学习一下。
pyproject.toml
这个文件就是 python 项目的主要配置文件,里面包括项目名称、python 版本要求、依赖包、打包配置、启动文件和方法等。
其实很好理解,它就是前端项目中的 package.json文件,就是 Java 项目中的 pom.xml文件。
有了它之后,就不需要 requirements.txt了。
安装多版本python解释器
python 版本众多,升级频繁,目前最新版本是3.14。你可能同时维护的项目中,有的项目需要3.7版本,有的项目就需要3.13版本的,甚至于有的项目只能在 python2.7运行。
那怎么办呢,总不能每次开一个项目就覆盖上一次的 python 版本吧,虽然可以通过设置修改环境变量来实现,一些 IDE 也能选择当前项目的解释器,但总归不够彻底。
如果你维护过node项目也应该深有体会。我维护的前端项目中,有一个项目只能在 node 14 下跑起来,而最新的项目可以在 node 22 运行。
所以 nvm 就相当有用,通过nvm可以把所有的node大版本都装上,然后给不同的项目设置不同的node版本。
pyenv就是这种工具,通过 pyenv可以安装各种版本的 python。
通过以下命令查看可安装的所有 python 版本。
查看所有已安装的版本。
安装某个版本的 python,例如安装最新的 3.14.0
切换当前项目的python版本,例如切换到 3.14.0
可是,为什么写 Java 写了这么多年,几乎没碰到过类似的问题呢?
想到答案感觉有些好笑,因为这么多年几乎一直在用 Java 8。有的开发者入行用 Java 8,等到失业、转行了,还是没逃过Java 8。
当然这只是其中一方面的原因,因为几乎不存在 JVM 不同版本的问题,所以就不需要类似于 nvm、pyenv 的工具,其实 Java 也是有的。另一方面就是 Java 中一直有 Maven、Gradle 这种包管理工具,很好的解决了版本依赖问题。
虚拟环境
好了,Python 本身的版本解决了,剩下的就是依赖包的版本问题了。
假设你一个项目中使用 Django 2.11,另一个项目使用 Django 5.2.6,怎么办呢?
如果用 pip 上来直接装,因为pip是全局的,那依赖冲突是很难避免的。
所以,这时候,虚拟环境就来了,一个项目可以创建一个虚拟环境,还是和node项目类似,npm 工具会根据当前项目的 package.json 文件安装所需版本的依赖包,不会影响其他项目。
给项目创建虚拟环境。
进入一个项目,创建一个虚拟环境,环境名称最好就叫做 .venv
然后,使用命令激活虚拟环境
source .venv/bin/activate
之后,就可以 pip install 安装所需的依赖包了。
uv 工具
如果还是需要手动 pip install,那怎么能称得上现代项目管理呢?
uv 就是管理项目依赖包的工具,类似于node中的npm、yarn,以及 maven。
以前项目依赖包都会写到 requirements.txt文件中,requirements.txt
是怎么来的呢,一般是通过 pip freeze得到项目依赖的列表,然后把列表写到里面。
但是,这里面可能有一些间接依赖,这些间接依赖实际上是不需要主动安装的。还有一点,如果有一天,不需要某个依赖包了,你在 requirements.txt中删除了这个依赖,但是由这个依赖间接引入的其他包,从此之后就在这悬着了。
uv 的设计目的是替代传统的 pip、pip-tools 和 venv 的部分功能,且与pyporject.toml配合效果最佳。
比如 uv venv是创建虚拟环境,等价于下面这个命令。
使用下面命令,可以安装 pyproject.toml中的依赖包。
并且,当你用 uv pip install安装一个依赖时,会自动加到 pyproject.toml配置文件中。
最后
源码还没怎么学,先补了一下现代 python 项目管理方式。
不过,这么弄下来,感觉把路铺了一下,以后不管是什么python项目,拿下来跑都毫无压力了,不用再担心版本和依赖问题了。
最近看 Agent 相关文档,如果要开发的话,逃不过 TypeScript 和 Python,建议这俩至少要掌握一个吧。