自动创建 requirements.txt

Automatically create requirements.txt

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

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

pip install pipreqs

pipreqs /path/to/project

可以找到更多与 pipreqs 相关的信息 here

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

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

pip3 freeze > requirements.txt  # Python3
pip freeze > requirements.txt  # Python2

如果您不使用虚拟环境,pigar将是您不错的选择。

在我的例子中,我使用的是 Anaconda,所以 运行 我环境中 conda 终端的以下命令解决了它,并自动为我创建了这个 requirements.txt 文件:

conda list -e > requirements.txt

这是从这个 Github link pratos/condaenv.txt

如果出现错误,并且您正在使用 anaconda,请尝试使用 .yml 选项:

conda env export > <environment-name>.yml

供其他人使用该环境,或者如果您要在另一台机器上创建新环境:

conda env create -f <environment-name>.yml

.yml option been found here

确保 运行 pip3 for python3.7.

pip3 freeze >> yourfile.txt

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

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2:

pip install virtualenv
virtualenv <myenvname>

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

安装这些模块

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

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

我建议每个人都使用环境,因为它可以让事情变得更容易。

如果面临与我相同的问题,即 不在虚拟环境中 并且想要 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))

P.S:它在检查模糊逻辑时可能有一些额外的库。

Python3 的最佳方法是:

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

首先,你的项目文件必须是py文件,直接python文件。如果你的文件是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 pipreqs
pipreqs [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;

如果你只想列出在 virtualenv 中使用的包,请使用:

pip freeze -l > requirements.txt 

如果您的系统中安装了很多依赖项,并且您需要requirements.txt用于特定项目,您可以先安装pipreqs:

$ pip install pipreqs

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

$ pipreqs

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

简单的 Pythonic 方式

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

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

要创建需求 Python 模块列表,请在您的终端中编写此代码:

pip3 freeze > requirements.txt

对于 python3:(我的机器上有 python 2 和 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

@Francis 说得对 -

但补充一下:

有了对 Jupyter notebooks 的额外支持——即 .ipynb 文件——你现在可以使用 https://pypi.org/project/pipreqsnb(与 pipreqs 相同的语法):

pip install pipreqsnb
pipreqs .

[我不是作者]

这个简单的任务在 Python 中如此复杂,真是令人惊叹。这是我认为自动执行此操作的最佳方法。

您需要两个工具:

1.pipreqs

pip3 install pipreqs

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

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

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

中的子包(即numpy)

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

  1. pip-tools

pip3 install pip-tools

pip-tools 将获取 requirements.in 中的包并生成包含所有子包的 requirements.txt。例如,如果你有 pandas==1.3.2requirements.in 中,pip-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 将拥有所有子包,因此您的构建是确定性的。

TL;DR

  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 项目的需求时,最好手动执行。

只需搜索“import”或“from x import”,即可获得需要安装的所有依赖项的列表(无需额外安装)。

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

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

为了帮助解决这个问题,总是 运行 requirements.txt 只在本地包上。本地包是指仅在您的项目文件夹中的包。为此,请执行以下操作: Pip freeze —local > requirements.txt

不是 pip freeze > requirements.txt。 注意local之前是双下划线。

但是安装 pipreqs 也有帮助。 点安装 pipreqs.

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