Python - 根据字符串导入模块并传递参数

8

我已经在网上和这个站点上搜索了,但找不到解决这个问题的答案。 我肯定它就在我的眼前,但找不到它。

我需要能够根据字符串导入模块。 然后执行该模块中的函数并传递参数。

我可以根据字符串进行导入,然后使用eval()执行,但我知道这不是处理此问题的最佳方法。 我也无法以那种方式传递参数。

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

def doSomething(var):
    print var

这是我正在执行的代码,用于导入TestAction并执行。

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

我该如何修改这段代码,使其不使用eval()函数,并将变量参数传递给doSomething()函数呢?
谢谢!
5个回答

4

感谢大家的帮助。看起来importlib结合getattr就是我需要的。供以后参考,这是适用于我的确切代码。

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

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

3
函数名也是变量吗?如果不是,只需使用您导入的模块:
mymod.doSomething('the var argument')

如果是这种情况,使用getattr:
fun = 'doSomething'
getattr(mymod, fun)('the var argument')

2

根据文档,最好使用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)

我希望这回答了你的问题,如果你还有什么疑问,请随意详细说明。

我有一个仅限于Python2.6的用例。不使用importlib的缺点是什么?由于importlib在2.6中不存在,所以我别无选择。但我想知道会出现什么问题?我认为一定会有一些可能的问题,否则就不会创建importlib了。 - synaptik

0
如果您使用的是Python 2.7或3.1+,最简单的方法是结合使用importlib模块和getattr。那么您的代码将如下所示:
import importlib

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接