假设你有模块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函数,或者我还没有找到它。
欢迎任何建议。
答案 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,有很多关于差异的问题。