自动创建requirements.txt

有时我从github下载python源代码,不知道如何安装所有依赖项。如果没有requirements.txt文件,我必须手动创建它。
问题是:
给定python源代码目录,是否可以从导入部分自动创建requirements.txt

1094898 次浏览

您可以使用以下代码生成requirements.txt文件:

pip install pipreqs
pipreqs /path/to/project

有关pipreqs的更多信息可以找到这里

有时您会遇到pip freeze,但这会保存环境中的所有包,包括您在当前项目中未使用的包。

建议使用Pipenv或其他工具来改进您的开发流程。

pip3 freeze > requirements.txt  # Python3pip freeze > requirements.txt  # Python2

如果你不使用虚拟环境,将是一个不错的选择。

在我的例子中,我使用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选项已在此处找到

确保为python3.7运行pip3。

pip3 freeze >> yourfile.txt

在执行上述命令之前,请确保您已经创建了一个虚拟环境。

python3:

pip3 install virtualenvpython3 -m venv <myenvname>

python2

pip install virtualenvvirtualenv <myenvname>

之后将您的源代码放在目录中。如果您现在运行python文件,如果您使用非本机模块,它可能不会启动。您可以通过运行pip3 install <module>pip install <module>安装这些模块。

这不会影响您的整个模块列表,除了您所处的环境。

现在您可以执行顶部的命令,现在您有一个需求文件,其中仅包含您在虚拟环境中安装的模块。现在您可以在顶部运行命令。

我建议每个人都使用环境,因为当涉及到这样的事情时,它会让事情变得更容易。

如果面对与我相同的问题,即不在虚拟环境中,并希望requirements.txt为特定项目或从选定文件夹(包括儿童)和pipreqs不支持。

您可以使用:

import osimport sysfrom fuzzywuzzy import fuzzimport 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))

P. S:它可能有一些额外的库,因为它检查fuzzy逻辑。

Python 3的最佳方法是:

pip3 freeze > requirements.txt

它为我工作…

不是一个完整的解决方案,但可能有助于编制Linux的候选名单。

grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > requirements.txt

首先,您的项目文件必须是直接python文件的py文件。如果您的文件是ipynb格式,您可以使用下面的代码行将其转换为py类型:

jupyter nbconvert --to=python

然后,您需要从cmd(mac的终端)安装pipreqs库。

pip install pipreqs

现在我们可以使用下面的代码创建txt文件了。如果你的文件在同一个路径上,你可以写 . / . 否则你需要给出文件的路径。

pipreqs ./

pipreqs /home/project/location

这将为您的项目创建一个requirements.txt文件。

我盲目地遵循接受的答案PIP3冻结>requirements.txt

它生成了一个巨大的文件,列出了整个解决方案的所有依赖项,这不是我想要的。

所以你需要弄清楚你想要产生什么样的requirements.txt。

如果你需要一个包含所有依赖项的requirements.txt文件,那么使用pip3

pip3 freeze > requirements.txt

但是,如果您想生成一个最小的requirements.txt,只列出你需要的依赖项,请使用pipreqs包。尤其是如果您在项目中的每个组件级别都有许多requirements.txt文件,则很有帮助,而不是解决方案范围级别的单个文件。

pip install pipreqspipreqs [path to folder]e.g. pipreqs .pipreqs . --force --ignore=tests (Overwrites exisiting requirements.txt, ignores the tests directory)

我创建了这个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;

如果你想只列出在虚拟环境中使用的包,请使用:

pip freeze -l > requirements.txt

如果您在系统中安装了许多依赖项,并且需要为特定项目requirements.txt,则可以安装第一个pipreqs:

$ pip install pipreqs

并在项目文件夹下执行以下命令。

$ pipreqs

此命令将为特定项目生成requirements.txt文件。

简单Pythonic方式

要获取标准requirements.txt文件中所有要求的列表,您可以使用以下命令。

pip freeze > requirements.txt

现在,这应该会自动创建一个标准需求文档,其中所有软件包都与它们的相应版本一起安装。

漂亮的打印终端

如果您只是想在终端上获得漂亮的打印,您可以使用以下方法。

pip list

这以漂亮的打印格式列出了所有已安装的软件包。

自定义依赖

如果您有一个项目文件夹,例如Github Repo,并且您想获得项目定制requirements.txt您可以使用以下包。https://pypi.org/project/pipreqs/pipreqs

用法

$ pipreqs /home/project/locationSuccessfully saved requirements file in /home/project/location/requirements.txt

requirements.txt内容

wheel==0.23.0Yarg==0.1.9docopt==0.6.2

对于python3:(我的机器上有python 2和3,其中python2是默认的)

# installpip3 install pipreqs
# Run in current directorypython3 -m  pipreqs.pipreqs .

python2:

pip install pipreqspython -m  pipreqs.pipreqs .

检查你的python版本:

python --version

@弗朗西斯是对的-https://stackoverflow.com/a/65728461/1021819

只是想补充一下:

通过对Jupyter笔记本的额外支持-即.ipynb文件-您现在可以使用https://pypi.org/project/pipreqsnb(与pipreqs相同的语法):

pip install pipreqsnbpipreqs .

【我不是作者】

这个简单的任务在Python中如此复杂,真是令人震惊。这是我认为自动完成它的最佳方法。

你需要两个工具:

1.pipreqs

pip3 install pipreqs

pipreqs将遍历您的项目并仅安装您的项目使用的包。而不是像pip freeze那样安装python环境中的所有包。

但是这种方法有一个问题。它不安装子包。

例如,您的项目使用pandas==1.3.2pandas本身在其他包中使用numpy==1.21.2。但是pipreqs本身并没有在requirments.txt中编写子包(即numpy)

这是您需要将pipreqs与第二个工具结合起来的地方。

  1. pip-ols

pip3 install pip-tools

pip-tools将采用requirements.in中的包并生成requirements.txt以及所有子包。例如,如果您有requirements.in中的pandas==1.3.2pip-tools将生成

numpy==1.21.2 # via pandasrequirements.txt

但是您需要在requirements.in中手动添加包。这很容易出错,您可能会偶尔忘记这样做。

这是您可以使用第一个工具的地方。

但是两个工具都写入requirements.txt。那么你如何修复它?

使用--savepath表示pipreqs写入requirements.in而不是默认的requirements.txt

在一个命令中完成它;只是做

pipreqs --savepath=requirements.in && pip-compile

好了。现在您无需担心手动维护包,并且您的requirements.txt将拥有所有子包,因此您的构建是确定性的。

太长别读

  1. pip3 install pipreqs
  2. pip3 install pip-tools

使用以下代码构建确定性requirements.txt

pipreqs --savepath=requirements.in && pip-compile

自动requirements.txt更新方法

在使用requirements.txt开发python应用程序时,我们有几种选择:

  1. 开发后生成requirements.txt,当我们想要部署它时。它由pip freeze > requirements.txtpipreqs执行,以减少混乱的结果。
  2. 每次安装后手动将每个模块添加到requirements.txt。
  3. 安装管理器,将为我们处理requirements.txt更新。

1-st选项有很多答案,2-d选项是不言自明的,所以我想描述3-d方法。有一个名为to-requirements.txt的库。要安装它,请输入以下内容:

pip install to-requirements.txt  # Pip install to requirements.txt

如果您一次阅读整个命令,您会看到它的作用。安装后,您应该设置它。运行:

requirements-txt setup

它覆盖pip脚本,以便每个pip installpip uninstall都会使用所需版本的包自动更新项目的requirements.txt文件。覆盖是安全的,因此在卸载此包后,pip的行为将正常。

您可以定制它的工作方式。例如,全局禁用它并仅为所需的目录激活它,仅为git存储库激活它,或者允许/禁止创建requirements.txt文件(如果它不存在)。

链接:

  1. 文档-https://requirements-txt.readthedocs.io/en/latest/
  2. GitHub-https://github.com/VoIlAlex/requirements-txt
  3. PyPI-https://pypi.org/project/to-requirements.txt/

或者,如果您使用的是类似于virtualenv的东西,您可以运行此命令来生成requirements.txt

$ ./.venv/bin/pip freeze > requirements.txt

使用pip freeze > requirements.txt是创建需求文件的糟糕方法!它可以作为您问题的临时解决方案,但在管理python项目的需求时,最好手动执行。

简单搜索“导入”或“从x导入”将为您提供需要安装的所有依赖项的列表(没有额外的内容)。

#0的问题它只是转储所有安装的具有严格版本的包,每个依赖项都有自己的依赖项,并且它们包含在转储中。例如,您安装了lib==1.0,需要sub-lib==0.5,如果您使用pip freeze,您将获得两者,但稍后当您希望将lib版本更新为2.0时,很可能会遇到冲突,因为lib v2.0现在使用sub-lib v1.0而不是您需要的v0.5……这迅速变得复杂用于多个依赖项。

我们在几个项目中遇到了这些问题,从那时起,我创建了一个自动化脚本来清理pip freeze的转储,它是安全的(注释不需要的依赖项)并且工作得很好。

要帮助解决此问题,请始终仅在本地包上运行requirements.txt。本地包是指仅在您的项目文件夹中的包。要做到这一点:点冻结-本地>requirements.txt

不是点冻结>requirements.txt.请注意,它在本地之前是双下划线。

但是安装pipreqs也有帮助。pip安装pipreqs。

不过,完美的解决方案是有一个管道文件。每当您安装新的本地包时,管道文件会自行更新。它还有一个类似于JavaScript中package.json的pipfile.lock。为此,请始终使用pipenv而不是pip安装您的软件包。所以我们做pipenv

因为大多数使用pipreqs的答案都不适合我。这是我的答案。

生成requirements.txt文件:

pip install pipreqs
python -m  pipreqs.pipreqs --encoding utf-8  /path/to/project

pip freeze相比,我更喜欢使用pipreqs,因为pip freeze保存环境中的所有包,包括您在当前项目中不使用的包。然而,pipreqs只保存您在项目中使用的包。

要安装需求,请使用:

pip3 install -r requirements.txt

你可以只做它与命令.它将创建requirement.txt并自动添加相关模块。

For Unix : pip3 freeze > requirements.txtFor Windos: pip freeze > requirements.txt

Pipenv用户可以通过以下方式从项目的Pipfile生成requirement.txt文件:

pipenv lock --requirements