有没有办法以编程方式从python模块导入对象?

时间:2014-08-08 13:23:22

标签: python

假设你有模块foo和对象栏。通常,您只需通过执行以下操作从模块导入对象:

from foo import bar

这很简单直接。 我想以编程方式完成同样的事情。对象的名称" bar"由用户提供,可以是一些任意值,所以我需要这样的东西:

eval("from foo import %s" % ("bar"))

我想知道如何实现这一目标。出于某种原因:

eval("from string import lower")

给了我syntaxerror。

我在这里意识到一些安全性考虑(有人可能会导入一些愚蠢的东西,破坏东西等)。目前我们可以将安全考虑放在一边。我只想从模块导入对象并稍后使用此对象。假设模块名称是字符串,我需要得到的对象是函数lower()我需要这样的东西:

import imp
f, filename, rest = imp.find_module("string")
my_module = imp.load_module("string", f, filename, rest)
object_i_need = my_module.load_object_from_module("lower", my_module)
object_i_need("HALLO") # should return "hallo"

目前缺少第三行,没有load_object_from_module函数,或者我还没有找到它。

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

您可以将__import__与Ashwini的想法一起使用:

module = __import__("foo")
obj = getattr(module, "bar")

请参阅__import__参考here

编辑:正如@LukasGraf指出的更好的做法是使用importlib.import_module

import importlib
module = importlib.import_module("foo")
obj = getattr(module, "bar")

答案 1 :(得分:-2)

您正在寻找exec声明。括号是可选的,它适用于字符串格式化和连接,因此以下所有工作:

exec "from string import lower"            # Works
exec "from string import %s" % ("lower")   # Also works

exec("from string import lower")           # Also works
exec("from string import %s" % ("lower"))  # Also works

obj = "lower"
exec "from string import " + obj           # Also works
exec("from string import " + obj)          # Also works

Eval只接受表达式而不是语句,而import是python中的语句。有关两者之间差异的更多信息,https://stackoverflow.com/a/2220790/3681392

有关表达式和语句之间差异的更多信息,请阅读python docs:https://docs.python.org/2/reference/simple_stmts.html或搜索SO,有很多关于差异的问题。