如何从函数中导入模块,但导入的模块在函数范围之外仍然存在?

How can I import a module from within a function, but have the imported module persist outside the function scope?

问题

出于可能令人费解的原因(见下文),我想执行以下操作:

def import_np():
    import numpy
    return numpy.array([0])

def test_np():
    return numpy.array([1])

现在,如果我尝试调用这两个方法,第一个有效,但第二个无效:它说 numpy is not defined。我该如何解决这个问题?

背景

我想导入一个我们有很多版本的内部模块(编辑:澄清一下,我们为每个版本分支)。理想情况下,我想参数化 import 语句,但我不能那样做,所以我想我可以有一个看起来像这样的函数:

def import_version(path_to_version):
    sys.path.append(path_to_version)
    import the_module

但是,我不能在这个方法之外使用the_module,这导致了我上面的问题。

您可以将包版本的路径用作脚本的全局配置变量。 然后您可以使用该全局变量执行 sys.path.append 函数调用,导入范围是您导入模块的整个脚本。

我建议您在模块加载失败时捕获异常。

import config
MODULE_PATH = config.path_to_version
sys.path.append(MODULE_PATH)
try:
   import the_module
except Exception as exp:
   // exception logging

这里有一个文件 config.py 包含模块版本的路径

path_to_version="your-path"