自动创建requirements.txt


276

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


2
您可以执行以下操作,pip freeze > requirements.txt将所有当前版本的python库保存到requirements.txt文件中
Shaikhul 2015年

7
@Shaikhul,但是在您没有安装依赖项的情况下却无济于事,因为您只是从GitHub下载了软件包...
jonrsharpe 2015年

8
请注意:a)不管当前项目中的使用情况如何,都将在该系统上pip freeze转储all已安装模块的当前版本。b)pip将仅列出已通过pip安装的模块
akskap,

Answers:


289

如果您使用虚拟环境,pip freeze > requirements.txt就可以了。IF NOTpigar将是您不错的选择。

顺便说一句,我不保证它能在2.6下使用。

更新

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

对于Python 3,请在下面使用

pip3 freeze > requirements.txt

3
对于任何出错的人,我建议pip3 freeze > requirements.txt在提出问题之前先尝试一下。
baranskistad

3
我执行了pip3 freeze > requirements.txt,很惊讶地没有找到我实际上正在使用的某些软件包,例如argparseand configparser。是否因为它们是Python核心的一部分?我相信一个更好的答案是在pipreqs下面使用,因为它只会列出您的项目正在使用的需求。
Alexis.Rolland '17

@ Alexis.Rolland是的,argparse而且configparser是属于Python3标准库,因此,这有什么错pip3 freeze?我不明白你的意思。
damnever '17

11
@damnever好的,谢谢!pip3 freeze提供了我环境中安装的所有Python软件包的列表,而pipreqs提供了我一直在寻找的源代码中实际使用的所有Python软件包的列表。除此之外,它没有任何问题。
Alexis.Rolland '17

1
pipenv有严重问题,请参见以下讨论:news.ycombinator.com/item?id=18612590
贾斯汀·凯斯

363

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

pip install pipreqs

pipreqs /path/to/project

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

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


1
@IgorBarinov那是一个警告,不会产生运行问题pipreqs,我在python 2.6上安装了它,并得到了同样的警告,但是它确实创建了一个requirements.txt文件,谢谢@DJanssens
Shaikhul

1
@Shaikhul如果收到这些警告,您将没有完整的文件,您只会得到部分要求。您可以在github.com/npow/MemNN/tree/hyperopt仓库中进行检查。我只有'hyperopt == 0.0.2 numpy的== 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
伊戈尔·巴里诺夫

1
就是说 it is strongly recommended to upgrade to a newer Python version
Shaikhul 2015年

2
很棒的工具。谢谢!它的强大功能是生成完全使用过的软件包,而不像pip Frozen!
Wesam Na

1
如果使用新的print语句输出格式,则这不适用于Python 3.6。
阿南德,CU

11

就我而言,我使用的是Anaconda,因此从我的环境中的conda终端运行以下命令即可解决该问题,并自动为我创建了此需求txt文件:

conda list -e > requirements.txt

摘自Github链接pratos / condaenv.txt

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

conda env export > <environment-name>.yml

供其他人使用的环境...或者如果要在其他计算机上创建新环境:conda env create -f .yml

.yml选项在这里找到


如果您不使用虚拟环境,这将创建一个过长的requirements.txt文件
SBFRF

1
这真的有效吗?每当我尝试过时,都会有依赖项和语法细节被pip install requirements.txt拒绝。
conner.xyz

我在使用.txt时发现了一些错误,因此也添加了另一个对我有用的选项...上面提到的“使用.yml”。
HassanSh__3571619

5

确保为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> or pip install <module> 

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

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

我建议大家使用环境,因为这样的事情会使事情变得容易。

希望这会有所帮助。


1

如果与我面临同样的问题,即不在虚拟环境上,并且想要特定项目或从所选文件夹(包括子文件夹)和pipreqs获得requirements.txt,则不支持。

您可以使用 :

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:在检查Fuzzylogic时,可能还有一些其他库。



0

如果您使用的是PyCharm,则在您将项目打开或克隆到PyCharm时,它会显示警报,并要求您安装所有必需的软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.