如何使用实际使用的库在Python中创建 requirements.txt 文件?

4
我发现Colab预装的库和AWS Sagemaker预定义的内核都很方便,但当我收集requirements.txt文件时,这种便利性变得非常恼人,因为我最终会得到许多我实际上没有在项目中使用过的库。我知道我可以在一开始就创建虚拟环境,但我想知道是否有一种避免它的方法。
我最近发现了watermark,它部分解决了这个问题。尽管如此,为了使这个解决方案完美,它仍然有两个问题,我将在下面举例说明,您可以在Colab中轻松重现这些问题。
!pip install fastai --upgrade
!pip install voila
!jupyter serverextension enable voila --sys-prefix
!pip install watermark
from fastai.vision.all import *
from fastai.vision.widgets import *
%load_ext watermark
%watermark --iversion  

由于我没有运行import fastai并将voila作为扩展加载,因此输出中既没有fastai也没有voila

%watermark -p fastai

这将返回正确的输出,例如fastai,但我希望能够自动生成,而无需手动检查缺失的软件包。

1
为什么要标记anaconda - merv
1个回答

0
虽然这不是IPython魔法,我编写了这个小的Python脚本(你可以将它作为单元格复制并运行)。
它通过查看导入的模块,将它们与您安装的pip分发进行交叉引用,然后根据该信息创建一个requirements.txt。
from pip._internal.utils.misc import get_installed_distributions
import sys
#import numpy as np # imported to test whether numpy shows up, which it does!

def get_imported_packages():
    p = get_installed_distributions()
    p = {package.key:package.version for package in p}

    imported_modules = set(sys.modules.keys())
    
    imported_modules.remove('pip')

    modules = [(m, p[m]) for m in imported_modules if p.get(m, False)]

    return modules


def generate_requirements(filepath:str, modules):
    with open(filepath, 'w') as f:
        for module, version in modules:
            f.write(f"{module}=={version}")


generate_requirements('requirements.txt', get_imported_packages())

我运行了代码,但在requirements.txt中仍然看不到“voila”,只有fastai。 - G. Macia
我还建议在这里添加一个新行字符 f.write(f"{module}=={version}\n")。 - G. Macia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接