自动创建文件“requirements.txt”
- 2025-01-06 08:31:00
- admin 原创
- 209
问题描述:
有时我从GitHub下载 Python 源代码,但不知道如何安装所有依赖项。如果没有任何requirements.txt文件,我必须手动创建它。
给定 Python 源代码目录,是否可以从导入部分自动创建requirements.txt ?
解决方案 1:
您可以使用以下代码来生成requirements.txt
文件:
pip install pipreqs
pipreqs /path/to/project
pipreqs
使用其GitHub的好处。
为什么不使用 pip freeze?
pip freeze
`pip install`仅保存在您的环境中安装的软件包。
pip freeze
保存环境中的所有包,包括您在当前项目中未使用的包(如果您没有virtualenv
)。有时您只需要创建
requirements.txt
一个新项目而不需要安装模块。
解决方案 2:
建议使用Pipenv 或其他工具来改善您的开发流程。
pip3 freeze > requirements.txt # Python3
pip freeze > requirements.txt # Python2
如果你不使用虚拟环境,pigar将是一个不错的选择。
解决方案 3:
对于 python3: (我的机器上有 python 2 和 python 3,其中 python2 是默认的)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
python2:
pip install pipreqs
python -m pipreqs.pipreqs .
要检查你的 Python 版本:
python --version
解决方案 4:
令人吃惊的是,这个简单的任务在 Python 中竟然如此复杂。以下是我认为自动完成此任务的最佳方法。
你需要两个工具:
pipreqs
pip3 install pipreqs
pipreqs 将检查你的项目,并仅安装项目使用的软件包。而不是像你pip freeze
所做的那样安装 Python 环境中的所有软件包。
但这种方法有一个问题,它不会安装子包。
例如,你的项目使用了pandas==1.3.2
。它本身在其他包中pandas
使用。但它本身并没有在中写子包(即numpy)numpy==1.21.2
`pipreqs`requirments.txt
这是需要pipreqs
与第二个工具结合的地方。
pip 工具
pip3 install pip-tools
pip-tools
将获取 中的包requirements.in
并生成requirements.txt
及其所有子包。例如,如果您pandas==1.3.2
在 中有requirements.in
,pip-tools
将生成
numpy==1.21.2 # via pandas
在requirements.txt
。
但是您需要手动添加包requirements.in
。这很容易出错,您可能会偶尔忘记这样做。
这是您可以使用第一个工具的地方。
但这两种工具都会写入requirements.txt
。那么如何修复它呢?
使用 --savepath
forpipreqs
写入,requirements.in
而不是默认的requirements.txt
。
要用一个命令完成此操作;只需执行
pipreqs --savepath=requirements.in && pip-compile
就这样。现在您无需担心手动维护软件包,您requirements.txt
将拥有所有子软件包,这样您的构建就是确定的。
总结
pip3 install pipreqs
pip3 install pip-tools
使用以下内容构建确定性requirements.txt
pipreqs --savepath=requirements.in && pip-compile
解决方案 5:
就我而言,我使用Anaconda ,因此从我的环境中的Conda终端运行以下命令可以解决问题,并自动为我创建这个requirements.txt文件:
conda list -e > requirements.txt
这是从 Github 链接pratos/condaenv.txt中获取的。
如果出现错误,并且您正在使用 Anaconda,请尝试使用以下.yml
选项:
conda env export > <environment-name>.yml
对于其他人使用该环境或者您在另一台机器上创建新环境:
conda env create -f <environment-name>.yml
.yml 选项在这里找到
解决方案 6:
我盲目地遵循了使用 pip3 freeze > requirements.txt 的公认答案
它生成了一个巨大的文件,列出了整个解决方案的所有依赖项,这不是我想要的。
因此您需要弄清楚您想要生成什么类型的 requirements.txt。
如果你需要一个包含所有依赖项的 requirements.txt 文件,那么使用 pip3
pip3 freeze > requirements.txt
但是,如果您想生成一个仅列出所需依赖项的最小 requirements.txt,请使用 pipreqs 包。如果您在项目的每个组件级别都有大量 requirements.txt 文件,而在解决方案范围级别上没有单个文件,则特别有用。
pip install pipreqs
pipreqs [path to folder]
e.g. pipreqs .
pipreqs . --force --ignore=tests (Overwrites exisiting requirements.txt, ignores the tests directory)
解决方案 7:
因为大多数答案pipreqs
对我来说都不起作用。这是我的答案。
要生成 requirements.txt 文件:
pip install pipreqs
python -m pipreqs.pipreqs --encoding utf-8 /path/to/project
pipreqs
我更喜欢使用pip freeze
,因为它pip freeze
会保存环境中的所有包,包括当前项目中未使用的包。但是,pipreqs
只保存项目中使用的包。
要安装要求,请使用:
pip3 install -r requirements.txt
解决方案 8:
首先你的项目文件必须是一个py文件,也就是直接的python文件,如果你的文件是ipynb格式,那么你可以使用下面这行代码将其转换为py类型:
jupyter nbconvert --to=python
然后,您需要从 cmd(mac 的终端)安装 pipreqs 库。
pip install pipreqs
现在我们可以使用下面的代码创建 txt 文件。如果你的文件位于同一路径,则只需写入 ./ 。否则,你需要提供文件的路径。
pipreqs ./
或者
pipreqs /home/project/location
这将为您的项目创建一个 requirements.txt 文件。
解决方案 9:
您可以使用以下命令执行此操作。它将创建文件requirement.txt并自动添加相关模块。
对于 Unix:
pip3 freeze > requirements.txt
对于 Windows:
pip freeze > requirements.txt
解决方案 10:
自动更新 requirements.txt 方法
在使用requirements.txt开发 Python 应用程序时,我们有几个选择:
开发完成后,当我们想要部署它时,生成requirements.txt
pip freeze > requirements.txt
。它由或执行,pipreqs
以获得更少的混乱结果。每次安装后,手动将每个模块添加到文件requirements.txt中。
安装管理器将为我们处理requirements.txt更新。
第一种选择有很多答案,第二种选择是不言自明的,所以我想描述第三种方法。有一个名为to-requirements.txt的库。要安装它,请输入以下内容:
pip install to-requirements.txt # Pip install to requirements.txt
如果您一次性阅读整个命令,您就会明白它的作用。安装后您应该进行设置。运行:
requirements-txt init
它会覆盖 pip 脚本,以便每个脚本pip install
或使用所需版本的软件包自动pip uninstall
更新项目的requirements.txt文件。覆盖是安全的,因此卸载此软件包后,pip 将正常运行。
您还可以自定义其工作方式。例如,全局禁用它并仅为所需目录激活它,仅为 git 存储库激活它,或者允许/禁止创建 requirements.txt 文件(如果不存在)。
参考:
文档
GitHub
吡啶甲酸
解决方案 11:
许多发帖者建议使用 pip freeze。我使用的是 pip 24.0,输出如下:
$ pip freeze > requirements.txt
aiohttp @ file:///croot/aiohttp_1707342283163/work
jinja2-cli==0.8.2
请注意,在第一行中,没有列出 aiohttp 的版本(可能是由 conda/mamba 安装的)
如果您需要 requirements.txt 采用第二行的形式,以供 pip 用作输入 requirements.txt,请使用:
$ pip list --format=freeze > requirements.txt
aiohttp==3.9.3
jinja2-cli==0.8.2
现在在这两种情况下,它都没有在需求列表中列出包的依赖关系。为此,您可以使用 conda/mamba list -e 或其他人提到的其他与 pip 相关的包。
解决方案 12:
创建文件requirement.txt
对于 Python 3 版本,命令为:
pip3 freeze > requirements.txt
对于 Python 2 版本,命令是:
pip freeze > requirements.txt
安装要求.txt
对于 Python 3 版本,命令为:
pip3 install -r requirements.txt
对于 Python 2 版本,命令是:
pip install -r requirements.txt
解决方案 13:
确保为 python3.7 运行 pip3。
pip3 freeze >> yourfile.txt
在执行上述命令之前,请确保您已经创建了虚拟环境。
python3:
pip3 install virtualenv
python3 -m venv <myenvname>
python2:
pip install virtualenv
virtualenv <myenvname>
之后将源代码放入目录中。如果您现在运行 python 文件,如果您使用非本机模块,它可能无法启动。您可以通过运行pip3 install <module>
或来安装这些模块pip install <module>
。
这不会影响您所在环境之外的整个模块列表。
现在您可以执行顶部的命令,现在您有一个仅包含您在虚拟环境中安装的模块的需求文件。现在您可以运行顶部的命令。
我建议每个人都使用环境,因为当遇到这样的事情时,它会让事情变得更容易。
解决方案 14:
简单的 Python 方式
要获取标准文件中所有要求的列表requirements.txt
,可以使用以下命令。
pip freeze > requirements.txt
现在,这应该会自动创建一个标准需求文件,其中包含所有安装的软件包及其相应的版本。
终端上的漂亮打印
如果您只是想在终端上获得漂亮的打印,您可以使用以下方法。
pip list
这以漂亮的打印格式列出了所有已安装的软件包。
自定义依赖
如果您有一个项目文件夹(例如 Github Repo),并且想要获取项目的自定义 requirements.txt,则可以使用以下包。https
://pypi.org/project/pipreqs/ pipreqs
用法
$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
requirements.txt 的内容
wheel==0.23.0
Yarg==0.1.9
docopt==0.6.2
解决方案 15:
如果你的系统中安装了许多依赖项,并且需要特定项目的 requirements.txt,则可以先安装 pipreqs:
$ pip install pipreqs
并在项目文件夹下执行以下命令。
$ pipreqs
此命令将为特定项目生成 requirements.txt 文件。
解决方案 16:
如果遇到与我同样的问题,即不在虚拟环境中,并且想要特定项目或选定文件夹(包括子文件夹)的 requirements.txt ,而 pipreqs 不支持。
您可以使用:
import os
import sys
from fuzzywuzzy import fuzz
import subprocess
path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"
files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.py'):
pyfiles.append(os.path.join(root, file))
stopWords = ['from', 'import',',','.']
importables = []
for file in pyfiles:
with open(file) as f:
content = f.readlines()
for line in content:
if "import" in line:
for sw in stopWords:
line = ' '.join(line.split(sw))
importables.append(line.strip().split(' ')[0])
importables = set(importables)
subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)
with open(path+'/requirements.txt') as req:
modules = req.readlines()
modules = {m.split('=')[0].lower() : m for m in modules}
notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']
new_requirements = []
for req_module in importables:
try :
new_requirements.append(modules[req_module])
except KeyError:
for k,v in modules.items():
if len(req_module)>1 and req_module not in notList:
if fuzz.partial_ratio(req_module,k) > 90:
new_requirements.append(modules[k])
new_requirements = [i for i in set(new_requirements)]
new_requirements
with open(path+'/requirements.txt','w') as req:
req.write(''.join(new_requirements))
PS:它可能有一些额外的库,因为它检查模糊逻辑。
解决方案 17:
如果您只想列出虚拟环境内使用的包,请使用:
pip freeze -l > requirements.txt
解决方案 18:
@Francis 说得对 - https://stackoverflow.com/a/65728461/1021819
但需要补充的是:
通过对 Jupyter 笔记本(即.ipynb
文件)的额外支持,您现在可以使用https://pypi.org/project/pipreqsnb(与 pipreqs 相同的语法):
pip install pipreqsnb
pipreqsnb .
[我不是作家]
解决方案 19:
为了使用pip freeze > requirements.txt
,请创建一个虚拟环境freeze
以避免添加不必要的依赖项,并在运行命令之前在虚拟环境中安装所有依赖项。
步骤 1:创建虚拟环境
python3 -m venv .venv
第 2 步:激活虚拟环境
source .venv/bin/activate
步骤 3:安装所有必需的依赖项
pip install <dependencies name>
步骤 4:运行freeze
命令
pip freeze > requirements.txt
解决方案 20:
对于 Python 3 来说最好的方法是:
pip3 freeze > requirements.txt
它对我有用......
解决方案 21:
这不是一个完整的解决方案,但可能有助于在 Linux 上编制一份候选名单。
grep --include='*.py' -rhPo '^s*(from|import)s+w+' . | sed -r 's/s*(import|from)s+//' | sort -u > requirements.txt
解决方案 22:
或者如果你正在使用类似virtualenv 的东西,你可以运行这个命令来生成requirements.txt文件:
./.venv/bin/pip freeze > requirements.txt
解决方案 23:
我创建了这个 bash 命令。
for l in $(pip freeze); do p=$(echo "$l" | cut -d'=' -f1); f=$(find . -type f -exec grep "$p" {} ; | grep 'import'); [[ ! -z "$f" ]] && echo "$l" ; done;
解决方案 24:
使用pip freeze > requirements.txt
创建需求文件是一种糟糕的方法!它可以作为问题的临时解决方案,但在管理 Python 项目的需求时,最好手动进行。
简单搜索“import”或“from x import”就会给你提供需要安装的所有依赖项的列表(没有多余的)。
它的问题pip freeze
是它只是转储所有已安装的软件包,并带有严格的版本,每个依赖项都有自己的依赖项,它们都包含在转储中。例如,您安装了 lib==1.0,需要 sub-lib==0.5,如果您使用,pip freeze
您将同时获得这两个,但是稍后当您希望将 lib 版本更新为 2.0 时,您很可能会遇到冲突,因为 lib v2.0 现在使用 sublib v1.0,而不是您需要的 v0.5...对于多个依赖项,这很快就会变得复杂。
我们在几个项目中遇到了这些问题,从那时起,我创建了一个自动脚本来清理pip freeze
的转储。它很安全(注释掉不需要的依赖项)并且效果很好。
解决方案 25:
为了帮助解决此问题,请始终仅在本地包上运行 requirements.txt。本地包是指仅在项目文件夹中的包。为此,请执行以下操作:Pip freeze —local > requirements.txt
不是 pip freeze > requirements.txt。请注意,local 前面有双下划线。
但是安装 pipreqs 也有帮助。Pip install pipreqs。
不过,完美的解决方案是使用 pipfile。每当您安装新的本地包时,pipfile 都会自行更新。它还有一个类似于 JavaScript 中的 package.json 的 pipfile.lock。为此,请始终使用 pipenv 而不是 pip 安装您的包。所以我们使用 pipenv
解决方案 26:
Pipenv 用户可以requirement.txt
使用以下命令从项目的 Pipfile 生成文件:
pipenv lock --requirements
解决方案 27:
对于与原始问题不同的用例,您确实有环境但没有固定依赖项,我发现pipreqs
不一致,因为它有时会重复具有不同版本的依赖项,例如两个带有版本的枕头条目9.0.0
,9.5.0
并且无法捕获一些需要的依赖项。
我意识到pipreqs
这对我个人来说有点过头了。
我看到几个人提到pip freeze
存储所有环境包的警告。
不过,有一个简单的解决方案对我来说很有效:
将未固定的顶级需求整理到开发和核心文件中,如下所示:
requirements
├── core.txt
└── dev.txt
由于你可能只希望满足生产的核心要求,
pip freeze | grep -F -f requirements/core.txt > requirements.txt
假设您想要省略+cpu
需求名称末尾的多余内容(对于 Hugging Face 部署我需要这样做),您可以事先链接一个管道过滤器。
pip freeze | grep -F -f requirements/core.txt | sed 's/+cpu//g' > requirements.txt
我发现这更容易维护。
解决方案 28:
使用:
pipreqs --savepath=requirements.in && pip-compile
如果您使用的是 Windows PowerShell ,它将无法运行。
试试这个;
( pipreqs --savepath=requirements.in ) -and (pip-compile)
扫码咨询,免费领取项目管理大礼包!