7

我搜索了网络和这个网站,但找不到这个问题的答案。我确定它就在我面前的某个地方,但找不到它。

我需要能够基于字符串导入模块。然后在传递参数的同时在该模块中执行一个函数。

我可以基于字符串导入,然后使用 eval() 执行,但我知道这不是处理这个问题的最佳方法。我似乎也不能那样传递论点。

我当前基于字符串设置的模块名为 TestAction.py,位于名为 Tasks 的文件夹中。这是 TestAction.py 的内容:

def doSomething(var):
    print var

这是我正在执行以导入 TestAction 并执行的代码。

module = "Tasks.TestAction"
import Tasks
mymod = __import__(module)
eval(module + ".doSomething()")

如何使此代码 #1 不使用eval()并且 #2 将 var 参数传递给doSomething()

提前致谢!

4

5 回答 5

4

感谢大家的帮助。看起来 importlib 结合 getattr 是我需要的。供将来参考这里是为我工作的确切代码。

module = "FarmTasks.TestAction"
mymod = importlib.import_module(module)

ds = getattr(mymod, "doSomething")
ds("stuff")
于 2013-04-25T20:24:21.637 回答
3

函数名也是可变的吗?如果没有,只需使用您导入的模块:

mymod.doSomething('the var argument')

如果是,请使用getattr

fun = 'doSomething'
getattr(mymod, fun)('the var argument')
于 2013-04-25T19:22:09.750 回答
1

根据文档

最好使用 importlib.import_module() 以编程方式导入模块。

使用它,您可以像这样检索您的模块:

import importlib
TestAction = importlib.import_module("TestAction", package="Tasks")

之后,您可以简单地正常调用函数或按名称调用函数:

TestAction.some_known_function(arg1, arg2)
getattr(TestAction, "some_other_function_name")(arg1, arg2)

我希望这回答了您的问题,如果您仍然缺少某些内容,请随时详细说明。

于 2013-04-25T19:36:05.370 回答
0

如果您使用 Python 2.7 或 3.1+,最简单的方法是将importlib模块与getattr. 您的代码将如下所示:

import importlib

module = "Tasks.TestAction"
mymod = importlib.import_module(module)
myfunc = getattr(mymod, "doSomething")
myfunc()
于 2013-04-25T19:24:06.567 回答
0

我最近写了一个导入给定函数的简单函数,它似乎对我有用:

def import_function(name):
    """Import a function by name: module.function or
    module.submodule.function, etc. Return the function object."""

    mod, f = name.rsplit('.', 1)
    return getattr(__import__(mod, fromlist=[f]), f)

您可以将其用作:

f = import_function('Tasks.TestAction.doSometing')
f()

要不就

import_function('Tasks.TestAction.doSometing')()
于 2013-04-25T19:24:13.767 回答