eval导入模块

42

我无法使用 eval() 函数导入模块。

我有一个函数,如果我使用 import vfs_tests as v,它可以正常工作。然而,使用 eval() 导入相同的模块,比如 eval('import vfs_tests as v'),会抛出语法错误。

为什么会这样呢?

4个回答

74

使用 exec

exec 'import vfs_tests as v'

eval只能用于表达式,而import是一个语句。

exec在Python 3中是一个函数:exec('import vfs_tests as v')

想要使用字符串导入模块,应该使用importlib模块:

import importlib
mod = importlib.import_module('vfs_tests')

在Python 2.6及更早版本中使用__import__


14
警告:exec非常强大。如果您要执行的字符串来自不可信的来源,则exec也极其危险。 - Ned Batchelder
在Python <= 2.6版本中,使用__import__时需要注意它不会像常规的import一样定义导入的名称。 - TextGeek

18

实际上,如果您绝对需要使用eval进行导入(例如,代码注入),由于exec是一个函数,您可以在Python 3中按如下方式执行:

eval("exec('import whatever_you_want')")
例如:
>>> eval('exec("from math import *")')
>>> sqrt(2)
1.4142135623730951

9

如果您想将所有代码作为字符串传递给eval函数,我的小技巧是:

>>> eval('exec("import uuid") or str(uuid.uuid4())')
'bc4b921a-98da-447d-be91-8fc1cebc2f90'
>>> eval('exec("import math") or math.sqrt(2)')
1.4142135623730951

3
你可以在eval语句中使用__import__来导入某些东西。
eval("__import__('os').system('ls')")

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