eval для импорта модуля

Я не могу импортировать модуль с помощью функции eval().

Итак, у меня есть функция, в которой, если я делаю import vfs_tests as v, она работает. Однако тот же импорт с использованием eval() как eval('import vfs_tests as v') вызывает синтаксическую ошибку.

Почему это так?


person Siddharth    schedule 16.06.2013    source источник


Ответы (3)


Используйте 1_:

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__.

person Ashwini Chaudhary    schedule 16.06.2013
comment
Слово предупреждения: exec очень мощный. Если часть строки, которую вы выполняете, исходит из ненадежного источника, то exec также чрезвычайно опасен. - person Ned Batchelder; 30.09.2014
comment
Имея import для py ‹= 2.6, обратите внимание, что имя импорта не остается определенным, как при обычном импорте. - person TextGeek; 21.10.2015

На самом деле. если вам абсолютно необходимо импортировать с помощью eval (например, внедрение кода), вы можете сделать это следующим образом в Python 3, поскольку exec — это функция:

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

Например:

введите здесь описание изображения

person Frederic    schedule 24.10.2020

Мой маленький трюк, если вы хотите передать весь код в виде строки в функцию eval:

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