Python - 基于字符串的导入模块然后传递参数

时间:2013-04-25 19:18:37

标签: python

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

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

我可以根据字符串导入然后使用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()

提前致谢!

5 个答案:

答案 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')()