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

Python-基于字符串导入模块,然后传递参数,python,Python,我在网上和这个网站上搜索,找不到这个问题的答案。我肯定它就在我面前的某个地方,但我找不到它 我需要能够导入基于字符串的模块。然后在传递参数的同时在该模块内执行一个函数 我可以基于字符串导入,然后使用eval()执行,但我知道这不是处理此问题的最佳方法。我似乎也不能那样传递论点 我当前基于字符串设置的模块名为TestAction.py,位于名为Tasks的文件夹中。 这是TestAction.py的内容: def doSomething(var): print var 这是我正在执行以导

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

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

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


提前谢谢

函数名也是变量吗?如果没有,请使用导入的模块:

mymod.doSomething('the var argument')
如果是,请使用
getattr

fun = 'doSomething'
getattr(mymod, fun)('the var argument')

如果使用Python2.7或3.1+,最简单的方法是将模块与
getattr
结合使用。您的代码将如下所示:

import importlib

module = "Tasks.TestAction"
mymod = importlib.import_module(module)
myfunc = getattr(mymod, "doSomething")
myfunc()

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

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

根据文件

最好使用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)

我希望这回答了您的问题,如果您还缺少什么,请随时详细说明。

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

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

ds = getattr(mymod, "doSomething")
ds("stuff")

我有一个仅限于Python2.6的用例。不使用importlib的缺点是什么?由于importlib在2.6版中不存在,因此我别无选择。但我想知道会出现什么问题?我假设一定有一些可能的问题,否则importlib就不会被创建。