Как уже отмечалось в комментарии, в современном Python предпочтительным способом создания экземпляров типов, которые не имеют встроенных имен, является вызов типа, полученного с помощью модуля types из стандартной библиотеки:
>>> import types
>>> m = types.ModuleType('m', 'The m module')
обратите внимание, что не автоматически вставляет новый модуль в sys.modules
:
>>> import sys
>>> sys.modules['m']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'm'
Эту задачу вы должны выполнить вручную:
>>> sys.modules['m'] = m
>>> sys.modules['m']
<module 'm' (built-in)>
Это может быть важно, поскольку объект кода модуля обычно выполняется после того, как модуль добавлен в sys.modules
- например, для такого кода совершенно правильно ссылаться на sys.modules[__name__]
, и это потерпите неудачу (KeyError
), если вы забыли этот шаг. После этого шага и установки m.__file__
, как у вас уже есть в вашем редактировании,
>>> code = compile("a=23", "m.py", "exec")
>>> exec code in m.__dict__
>>> m.a
23
(или эквивалент Python 3, где exec
- это функция, если, конечно, Python 3 - это то, что вы используете ;-) - это правильно (конечно, вы обычно получаете объект кода более тонким способом чем составление строки, но это не важно для вашего вопроса; -).
В старых версиях Python вы использовали модуль new
вместо модуля types
для создания нового объекта модуля при запуске, но new
не рекомендуется с Python 2.6 и удаляется в Python 3.