【问题标题】:Automatically create requirements.txt自动创建 requirements.txt
【发布时间】:2015-10-19 11:38:40
【问题描述】:

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

【问题讨论】:

  • 您可以通过运行pip freeze > requirements.txt 来完成,将当前版本的所有python 库保存到requirements.txt 文件中
  • @Shaikhul 但这在您没有安装依赖项的情况下无济于事,因为您只是从 GitHub 下载了包...
  • 请注意:a) pip freeze 将转储当前版本的all 该系统上已安装的模块,无论当前项目中的使用情况如何。 b) pip 只会列出通过 pip 安装的模块
  • @akskap 有哪些非 pip 安装模块的方式? setup.py 安装? pipreqs 会忽略这些吗?

标签: python dependencies python-import requirements.txt


【解决方案1】:

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

pip install pipreqs

pipreqs /path/to/project

更多关于 pipreqs 的信息可以在here找到。

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

【讨论】:

  • @IgorBarinov 这是一个警告,运行pipreqs 不会产生问题,我将它安装在python 2.6 上并收到相同的警告,但它确实创建了一个requirements.txt 文件,谢谢@DJanssens
  • @Shaikhul 如果您收到这些警告,您将不会获得完整的文件,您只会获得部分要求。你可以在github.com/npow/MemNN/tree/hyperopt repo 上查看。我只有'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
  • that saidit is strongly recommended to upgrade to a newer Python version
  • 我使用了 pipreqs,需要在扫描的项目文件夹中指定使用的字符集 - 否则我收到 pipreqs 生成的错误:pipreqs --encoding utf-8
  • 在 Windows 10 上的 Python 3.9 中工作
【解决方案2】:

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

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

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

【讨论】:

  • 对于任何出错的人,我建议在提问之前尝试pip3 freeze > requirements.txt
  • 我执行了pip3 freeze > requirements.txt,但我很惊讶没有找到一些我实际使用的包,例如argparseconfigparser。是因为它们是 Python 核心的一部分吗?我相信更好的答案是使用下面的pipreqs,因为它只会列出您的项目正在使用的要求。
  • @damnever 好的,谢谢! pip3 freeze 给了我安装在我的环境中的所有 Python 包的列表,而pipreqs 给了我所有在我的源代码中实际使用的包,这是我正在寻找的。除此之外,没有什么问题。
  • pipenv 有严重问题,请参阅此讨论:news.ycombinator.com/item?id=18612590
  • 管道到requirements.txt可以是quite a bad idea.
【解决方案3】:

在我的例子中,我使用 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 option been found here

【讨论】:

  • 如果您没有使用虚拟环境,这将创建一个过长的 requirements.txt 文件
  • 这真的有效吗?每当我尝试过这个时,pip install requirements.txt 拒绝的依赖项和语法细节。
  • 我在使用 .txt 时发现了一些错误,所以只添加了另一个对我也有效的选项...“使用 .yml”。
【解决方案4】:

对于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

【讨论】:

  • 为我工作,稍作修改:pip install pipreqs 然后python -m pipreqs.pipreqs .
  • @Tirbo06 我也添加了python2版本,以及检查安装了哪个版本的python的命令:)
【解决方案5】:

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

pip3 freeze > requirements.txt

【讨论】:

  • 与上述其他答案相比,这增加了什么?
  • 有一个简单的方法来做到这一点
  • 这在 colab 中也适用于我!
【解决方案6】:

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

jupyter nbconvert --to=python

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

pip install pipreqs

现在我们可以使用下面的代码创建 txt 文件。如果您与文件在同一路径中,则只需编写 ./ 。否则,您需要提供文件的路径。

pipreqs ./

pipreqs /home/project/location

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

【讨论】:

  • 我收到No template sub-directory with name 'python' found in the following paths
  • 您可以尝试使用以下命令卸载和安装 nbconvert: pip uninstall nbconvert pip install nbconvert @koppor
【解决方案7】:

我盲目地遵循使用的公认答案 pip3 冻结 > requirements.txt

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

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

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

pip3 freeze > requirements.txt

但是,如果您想生成一个只列出您需要的依赖项的最低要求.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)

【讨论】:

【解决方案8】:

确保为 python3.7 运行 pip3。

pip3 freeze >> yourfile.txt

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

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2

pip install virtualenv
virtualenv <myenvname>

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

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

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

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

【讨论】:

    【解决方案9】:

    Python 3 的最佳方式是:

    pip3 freeze > requirements.txt
    

    它对我有用...

    【讨论】:

    【解决方案10】:

    如果面临与我相同的问题,即 不在虚拟环境中,并且需要 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:它可能有一些额外的库来检查模糊逻辑。

    【讨论】:

      【解决方案11】:

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

      $ pip install pipreqs
      

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

      $ pipreqs
      

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

      【讨论】:

        【解决方案12】:

        简单的 Pythonic 方式

        要获取标准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
        

        【讨论】:

          【解决方案13】:

          让这个简单的任务在 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-tools

          pip install pip-tool

          pip-tools 将获取requirements.in 中的包并生成带有所有子包的requirements.txt。例如,如果您有 pandas==1.3.2 in requirements.in, pip-tools 会生成

          numpy==1.21.2 # via pandasrequirements.txt

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

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

          但是这两个工具都写信给requirements.txt。那么如何解决呢?

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

          在一个命令中完成;做吧

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

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

          TL;DR

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

          使用以下内容构建确定性requirements.txt

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

          【讨论】:

            【解决方案14】:

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

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

            【讨论】:

              【解决方案15】:

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

              pip freeze -l > requirements.txt 
              

              【讨论】:

                【解决方案16】:

                自动更新 requirements.txt 方法

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

                1. 在开发后生成 requirements.txt,当我们想要部署它时。它由pip freeze &gt; 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/

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

                    @Francis 说得对 - https://stackoverflow.com/a/65728461/1021819

                    只是补充一下:

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

                    pip install pipreqsnb
                    pipreqs .
                    

                    [我不是作者]

                    【讨论】:

                      【解决方案19】:

                      如果您使用的是 PyCharm,当您打开项目或将项目克隆到 PyCharm 中时,它会显示一条警报并要求您安装所有必要的包。

                      【讨论】:

                      • 这真的与提出的问题无关。
                      • @GrantCurell 你的问题是正确的,但它解决了第一句话中可以找到的问题。
                      猜你喜欢
                      • 2020-10-09
                      • 2022-01-16
                      • 2015-07-08
                      • 2018-11-19
                      • 1970-01-01
                      • 2020-12-22
                      相关资源
                      最近更新 更多