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

问题描述

我发现 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  

fastaivoila 都没有出现在输出中,因为我没有运行 import fastai 和加载 voila 作为扩展。

%watermark -p fastai

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

解决方法

虽然这不是 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())

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...