eval за импортиране на модул

Не мога да импортирам модул с помощта на функцията eval().

И така, имам функция, при която, ако направя import vfs_tests as v, тя работи. Обаче същото импортиране, използващо eval() като eval('import vfs_tests as v'), хвърля синтактична грешка.

защо е така


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


Отговори (3)


Използвайте 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__.

person Ashwini Chaudhary    schedule 16.06.2013
comment
Едно предупреждение: 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