我有一个具有可选依赖项的项目,具体取决于它可能需要 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
已安装在我的环境中。
我想知道为什么它不起作用以及如何使它起作用,请帮助我。
答案 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
中提取出来的。不过,在很多函数中这样做会开始看起来很混乱。