从另一个包中获取模块引用的Python方法,已知包和模块名称。

3
如何按名称从另一个包获取模块的引用?
考虑以下情况:
genericCall(packageName, moduleName, methodName):
    #Call moduleName.methodName
    #knowing that the moduleName is in packageName

在哪里

packageName="p1"
moduleName="m1"
methodName="f1"
2个回答

3

你需要导入模块或包,如果要按名称导入,可以使用 __import__importlib.import_module

import importlib

def genecirCall(package_name, module_name, function_name):
    # import module you need
    module = importlib.import_module('%s.%s' % (package_name, module_name))
    getattr(module, function_name)() # make a call

请注意,在此示例中,module 变量将是局部的。

2

__import__ 提供了动态导入包的能力。导入包后,您可以使用 getattr 从模块名称获取模块对象(在Python中称为内省)。由于这两个函数都是内置函数,因此可以在不明确导入其他包的情况下使用它们。 文档提供了有关这些内置函数的更多信息。

package = __import__(packageName)
module = getattr(package, moduleName)
method = getattr(module, methodName)
method(...)

是的,但我只知道包和模块名称的字符串表示形式...所以无法像你建议的那样使用getattr函数。 - CosminO
@Ameoo 看起来我误解了你的问题。回答已更新。 - Logan Ding
1
答案不应仅包含代码。最好添加用到的方法及其潜在缺点的说明。 - lejlot
注意 module = getattr(package, moduleName)。导入一个包并不会将其文件作为模块导入到包的命名空间中(即,文件和模块不是同一件事)。 - H.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接