0

在 Python 3 中,我得到了这样的工作:

def aFunctionImportingAndCallingAnotherFunction(functionName, args):
    packageString = "a_nested_package.to_be_imported.at_run_time"
    _temp = __import__(packageString, globals(), locals(), [functionName], 0)
    function = eval("_temp." + functionName)
    return function(args)

在 Python 2.7 中,我收到一个错误,我传入的函数functionName不存在。

在这个例子中,包a_nested_packagesys.path,它有一个包to_be_imported,它有一个包at_run_time。所有包都有__init__.py文件。

我试过了:

  • 使用 level 参数(我尝试了 -1 和 1)
  • a_nested_package_packageString
  • a_nested_package从中删除packageString并替换为.

另外,如果这是执行运行时导入函数的完全错误的方法,请告诉我!我对 Python 很陌生(来自 C++、PHP 和 Java)

4

2 回答 2

3

使用importlib模块动态导入模块,然后使用getattr()从该模块中检索特定名称:

import importlib

def aFunctionImportingAndCallingAnotherFunction(functionName, args):
    module = importlib.import_module(packageString)
    func = getattr(module, functionname)
    return func(*args)
于 2013-10-28T22:29:59.567 回答
2

__import__就像import声明一样工作。(有充分的理由。)

当你这样做时:

import foo.bar.baz

您的文件中没有baz对象;你明白了foo!同样,这个:

__import__('foo.bar.baz')

返回foo模块,但保证它已填充bar.

所以在你的例子中,__import__正在返回a_nested_package,你必须自己遍历路径的其余部分。这很糟糕,这就是为什么importlib有用。:)

于 2013-10-28T22:44:23.807 回答