Вы можете просто создать экземпляр types.Module
:
import types
mod = types.ModuleType("mod")
Затем вы можете заполнить его exec
, как вы это делали:
exec(code, mod.__dict__)
mod.testFunc() # will print 'spam!'
Таким образом, ваш код будет выглядеть следующим образом:
import types
def import_code(code, name):
# create blank module
module = types.ModuleType(name)
# populate the module with code
exec(code, module.__dict__)
return module
code = """
def testFunc():
print('spam!')
"""
m = import_code(code, 'test')
m.testFunc()
Как прокомментировал @Error - Syntactical Remorse, вы должны помнить, что exec
в основном выполняет любой код, содержащийся в строке, которую вы передаете, поэтому вы должны использовать его сДополнительная забота.По крайней мере, проверьте, что вы получили, но было бы хорошо использовать исключительно предопределенные строки.