eval 导入模块

问题描述 投票:0回答:5

我无法使用

eval()
函数导入模块。

所以,我有一个函数,如果我这样做

import vfs_tests as v
它就会起作用。但是,使用
eval()
(如
eval('import vfs_tests as v')
)进行相同的导入会引发语法错误。

为什么会这样?

python eval
5个回答
80
投票

使用

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__


20
投票

事实上。如果您绝对需要使用

eval
进行导入(例如,代码注入),您可以在 Python 3 中按照以下方式进行操作,因为
exec
是一个函数:

eval("exec('import whatever_you_want')")

例如:

>>> eval('exec("from math import *")')
>>> sqrt(2)
1.4142135623730951

10
投票

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

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

5
投票

您可以在

__import__
内部使用
eval
来导入某些内容。

eval("__import__('os').system('ls')")

0
投票

我努力解决这个问题并找到了完美的解决方案:

eval(
    f"pv.parse('{version_1}') {comparator} pv.parse('{version_2}')",
    {"pv": __import__("packaging").version}
)
© www.soinside.com 2019 - 2024. All rights reserved.