【问题标题】:How to create requirements.txt in Python with actually used libraries?如何使用实际使用的库在 Python 中创建 requirements.txt?
【发布时间】:2021-04-16 19:52:06
【问题描述】:

我发现 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 并将瞧瞧作为扩展加载。

%watermark -p fastai

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

【问题讨论】:

  • 为什么要标记anaconda

标签: python pip conda google-colaboratory reproducible-research


【解决方案1】:

虽然这不是 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。
  • 我还建议在这里添加一个换行符 f.write(f"{module}=={version}\n")
猜你喜欢
  • 2020-04-03
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2020-10-31
相关资源
最近更新 更多