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


当前回答

要帮助解决这个问题,请始终只在本地包上运行requirements.txt。我所说的本地包是指只在项目文件夹中的包。要做到这一点,请做: Pip freeze -local > requirements.txt

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

不过,安装pipreqs也有帮助。 Pip安装Pip。

不过,最好的解决办法是准备一个皮夹。当您安装新的本地包时,pipfile会自行更新。它也有一个pipfile。锁类似于包。json。 要做到这一点,请使用pipenv而不是pip安装软件包。 我们用pipenv

其他回答

如果遇到和我一样的问题,即不在虚拟环境中,并且想要特定项目的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))

附注:它可能有一些额外的库,因为它检查模糊逻辑。

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

你需要两个工具:

1. pipreqs

Pip3安装pipreqs

Pipreqs会检查你的项目,只安装项目使用的包。而不是像pip freeze那样在python环境中执行所有包。

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

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

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

pip-tools

Pip3安装pip-tools

Pip-tools将接受需求中的包。并生成带有所有子包的requirements.txt。例如,如果你有 Pandas ==1.3.2的需求。在,pip-tools将生成

Numpy ==1.21.2 # via pandas in requirements.txt。

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

在这里可以使用第一个工具。

但是这两个工具都是根据requirements.txt编写的。那么如何解决这个问题呢?

使用pipreqs的——savepath来写入需求。,而不是默认的requirements.txt。

一次命令就完成;只做

pipreqs——savepath =需求。在&& pip-compile

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

博士TL;

Pip3安装pipreqs Pip3安装pip-tools

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

pipreqs——savepath =需求。在&& pip-compile

因为大多数使用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

你可以使用下面的代码来生成一个requirements.txt文件:

pip install pipreqs

pipreqs /path/to/project

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

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

Pipenv用户可以从项目的Pipfile中生成require .txt文件:

pipenv lock --requirements