我搜索了网站和这个网站,无法找到这个问题的答案。我确定它在我面前的某个地方,但无法找到它。
我需要能够基于字符串导入模块。然后在传递参数时在该模块中执行一个函数。
我可以根据字符串导入然后使用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()
?
提前致谢!
答案 0 :(得分:4)
感谢大家的帮助。看起来像importlib结合getattr是我需要的。为了将来参考,这里有适合我的确切代码。
module = "FarmTasks.TestAction"
mymod = importlib.import_module(module)
ds = getattr(mymod, "doSomething")
ds("stuff")
答案 1 :(得分:2)
函数名称是否也可变?如果没有,只需使用您导入的模块:
mymod.doSomething('the var argument')
如果是,请使用getattr
:
fun = 'doSomething'
getattr(mymod, fun)('the var argument')
答案 2 :(得分: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)
我希望这能回答你的问题,如果你还在遗漏某些东西,请随时详细说明。
答案 3 :(得分:0)
如果您使用Python 2.7或3.1+,最简单的方法是将importlib
模块与getattr
结合使用。您的代码看起来就像那样:
import importlib
module = "Tasks.TestAction"
mymod = importlib.import_module(module)
myfunc = getattr(mymod, "doSomething")
myfunc()
答案 4 :(得分: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')()