我无法使用 eval()
函数导入模块。
我有一个函数,如果我使用 import vfs_tests as v
,它可以正常工作。然而,使用 eval()
导入相同的模块,比如 eval('import vfs_tests as v')
,会抛出语法错误。
为什么会这样呢?
使用 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__
。
实际上,如果您绝对需要使用eval
进行导入(例如,代码注入),由于exec
是一个函数,您可以在Python 3中按如下方式执行:
eval("exec('import whatever_you_want')")
例如:>>> eval('exec("from math import *")')
>>> sqrt(2)
1.4142135623730951
如果您想将所有代码作为字符串传递给eval函数,我的小技巧是:
>>> eval('exec("import uuid") or str(uuid.uuid4())')
'bc4b921a-98da-447d-be91-8fc1cebc2f90'
>>> eval('exec("import math") or math.sqrt(2)')
1.4142135623730951
eval("__import__('os').system('ls')")