今天咱们来聊聊 Python 项目中如何生成一个“最小的” requirements.txt
文件。我们都知道,当我们开发一个 Python 项目的时候,很多时候都会在一个虚拟环境中进行,这样一来,就能避免不同项目之间的依赖冲突。
可有时候,也不一定每次都会特意为项目创建一个独立的虚拟环境,尤其是当我们懒得去设置时,往往会在一个全局的环境中进行开发。比如,大家可能习惯了用 conda
中的 base
环境开发项目,这种情况就很常见。
问题来了:如何生成这个项目所需要的最小 requirements.txt
文件呢?也就是说,怎么确保 requirements.txt
文件里,既包含了所有依赖的库,又不会因为没有用到的库,导致文件过于臃肿?
这个问题其实很常见,我们有几个常见的解决办法,今天就来跟大家聊一聊,怎么高效且干净地生成你所需要的依赖清单。
首先,不得不提的一个传统方法是使用 pip freeze
,但是这个方法并不是最优解,尤其是在你没有使用虚拟环境的情况下。我们一起来看看这个方法有什么问题,再讨论一下更好的解决方案。
使用 pip freeze 命令生成 requirements.txt(但其实不推荐)
pip freeze
命令的作用是列出当前 Python 环境下安装的所有依赖包,它会输出所有包的版本信息。如果你在全局环境或者一个已经装满各种包的虚拟环境下运行这个命令,那么生成的 requirements.txt
里就会包含你环境中所有的包。这显然是多余的,因为你可能只用到了其中的很少一部分,而其他的包完全不相关。
怎么用 pip freeze
来生成 requirements.txt
文件?
在项目根目录下打开命令行或者终端,运行以下命令:
这样会生成一个 requirements.txt
文件,内容大致会像这样:
如上所示,它会列出所有安装的包,而不管你在项目中有没有实际用到这些包。你可以看到,即使你只用了 flask
,pandas
可能只是其他包依赖的,结果它们都会出现在你的依赖清单里。
如果你没意识到这个问题,直接将这个文件分享给别人,别人就可能会在安装依赖时,得到一些他们根本不需要的包,这显然是有点问题的。那么,我们该怎么办呢?
使用 pipreqs 生成精准的 requirements.txt(推荐)
一个更好的方法是使用 pipreqs
这个工具,它的优势在于它会根据你的项目源代码文件分析出实际用到的库,并只将这些库和对应的版本列出在 requirements.txt
文件中。这样就避免了像 pip freeze
那样将整个环境中的所有包都列出来的问题。
如何使用 pipreqs?
首先,你需要安装 pipreqs
。你可以通过下面的命令来安装:
安装完成后,我们就可以在项目根目录下运行 pipreqs
来生成一个只包含你项目实际依赖库的 requirements.txt
文件。命令如下:
这条命令会做以下几件事情:
-
./
表示当前目录,告诉pipreqs
在当前项目目录下扫描源代码文件; -
--encoding=utf8
指定编码格式为 UTF-8,确保处理中文或其他非ASCII字符时不会出错; -
--force
强制覆盖已有的requirements.txt
文件(如果文件已经存在的话)。
运行命令之后,pipreqs
会自动扫描你的项目目录中的 Python 文件,分析出你使用到的所有第三方库,并将它们和版本号写入 requirements.txt
文件。
结果是什么样的?
假设你有一个使用了 flask
和 requests
库的项目,使用 pipreqs
生成的 requirements.txt
文件可能会是这样的:
你看,只有你实际用到的库被列出,而项目中没有使用到的包就不会出现在里面了。简洁且精确,不会有冗余。
为什么推荐 pipreqs?
-
准确性:它只会列出实际用到的依赖包,避免了像
pip freeze
那样的冗余。 -
易用性:命令简单直观,几乎不需要额外配置,直接在项目根目录运行即可。
-
清洁性:生成的
requirements.txt
文件非常干净,不会有多余的包。
当然,如果你的项目是一个比较简单的脚本,只有几个常见的库,那用 pip freeze
也无妨。但对于大项目,尤其是在没有虚拟环境的情况下,使用 pipreqs
会更合适。
一键安装依赖
不论你是使用 pip freeze
还是 pipreqs
生成的 requirements.txt
文件,使用方法都是一样的。如果你想让别人快速安装这些依赖,只需要提供给他们这个 requirements.txt
文件,并执行以下命令:
这会自动安装文件中列出的所有依赖包,省去了手动逐个安装的麻烦。
今天我们讨论了两种生成 requirements.txt
文件的方法:一种是传统的 pip freeze
,另一种是更精确的 pipreqs
。
虽然 pip freeze
简单易用,但它会把你环境中所有安装的包都列出来,而不仅仅是你项目需要的那些。相比之下,pipreqs
能够精确地扫描项目代码,找到实际需要的依赖包,生成的 requirements.txt
文件更干净、更准确。
如果你在一个干净的虚拟环境中开发,pip freeze
也许可以用,但如果你没有为项目创建虚拟环境,或者希望只列出项目中实际依赖的库,那 pipreqs
就是你最好的选择。