Динамический импорт модуля Python - PullRequest
27 голосов
/ 26 сентября 2010

У меня есть доверенный удаленный сервер, который хранит множество пользовательских модулей Python. Я могу получить их через HTTP (например, используя urllib2.urlopen) как текст / обычный текст, но не могу сохранить полученный код модуля на локальный жесткий диск. Как я могу импортировать код как полностью работающий модуль Python, включая его глобальные переменные и импорт?
Полагаю, мне нужно использовать некоторую комбинацию функций модуля exec и imp, но я пока не могу заставить его работать.

Ответы [ 2 ]

45 голосов
/ 27 сентября 2010

Похоже, это должно сработать: импорт динамически сгенерированного модуля

>>> import imp
>>> foo = imp.new_module("foo")
>>> foo_code = """
... class Foo:
...     pass
... """
>>> exec foo_code in foo.__dict__
>>> foo.Foo.__module__
'foo'
>>>

Также, как предлагается в статье ActiveState, вы можете добавить свой новый модуль в sys.modules:

>>> import sys
>>> sys.modules["foo"] = foo
>>> from foo import Foo
<class 'Foo' …>
>>>
5 голосов
/ 27 сентября 2010

Вот кое-что, что я недавно добавил в закладки, что охватывает нечто подобное:

Это немного за то, что вы хотите, но основная идея есть.

...