如何仅在需要使用模块时才导入模块?

时间:2021-03-01 13:31:05

标签: python python-3.x pytorch

我有一个具有可选依赖项的项目,具体取决于它可能需要 torch 库的用例。 PyTorch 占用大量内存,在不需要使用时安装它不是最佳选择。在我的项目中,有部分代码使用了 torch,但大部分逻辑不需要它。我正在尝试实现可选导入,以便在需要使用 torch 时使用它,这是我的想法:

def _lazy_import_torch():
    import torch

def main():
    _lazy_import_torch()
    print(f'You have torch: {torch.__version__}')

if __name__ == '__main__':
    main()

当我运行此代码时,似乎未导入 torch

$ python main.py
Traceback (most recent call last):
  File "main.py", line 9, in <module>
    main()
  File "main.py", line 6, in main
    print(f'You have torch: {torch.__version__}')
NameError: name 'torch' is not defined

torch 已安装在我的环境中。

我想知道为什么它不起作用以及如何使它起作用,请帮助我。

2 个答案:

答案 0 :(得分:2)

此代码使 torch 成为 _lazy_import_torch 函数的本地名称:

def _lazy_import_torch():
    import torch

执行后,此名称将消失,因此您将无法在外部此函数的任何地方访问它。

您可以从函数返回 torch,然后将其传递到任何地方:

def _lazy_import_torch():
    import torch
    return torch

def main():
    torch = _lazy_import_torch()
    print(f'You have torch: {torch.__version__}')

或者使用全局变量:

torch = None

def _lazy_import_torch():
    global torch
    import torch

如果模块还没有被导入,每次尝试使用都会报错,但是运行_lazy_import_torch后,全局名称torch会引用{ {1}} 模块。


以下是标准库中 CSV 模块的示例:

torch

答案 1 :(得分:0)

按照您的操作方式,torch 将被添加到 sys.modules,但不会在您导入它的函数之外使用名称 torch 可见。您可以使用 sys.modules['torch'] 在其他函数中查找。

如果它只用在一两个函数中,那么你可以在这些函数的顶部导入它。您只需支付一次导入费用,因为它只是从 sys.modules 中提取出来的。不过,在很多函数中这样做会开始看起来很混乱。