У меня есть доверенный удаленный сервер, на котором хранятся многие настраиваемые модули Python. Я могу получить их через HTTP (например, используя urllib2.urlopen
) в виде текста/plain, но я не могу сохранить код извлеченного модуля на локальный жесткий диск. Как я могу импортировать код как полностью работоспособный модуль Python, включая его глобальные переменные и импорт?
Я полагаю, что мне нужно использовать некоторую комбинацию функций модуля exec
и imp
, но я не смог заставить его работать.Динамически импортирующий модуль Python
ответ
Похоже, что это следует сделать трюк: importing a dynamically generated module
>>> 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' …> >>>
Ницца, мне это интересно некоторое время. – intuited
Есть ли трюк, чтобы я мог позволить пользователю «с foo import Foo»? В этом примере я получаю «ImportError: No module named foo». –
См. Мой обновленный ответ. –
Вот что-то Некоторое время назад я добавил ссылку, которая покрывает нечто подобное:
Это немного сверх того, что вы хотите, но основная идея есть.
Вы загружаете их через ssl или каждый доверенный доверенный маршрутизатор? : P – aaronasterling
На самом деле, да - как хранилище модулей, так и внешний сервер являются частями одной системы (и даже расположены в одной и той же серверной комнате). Предположим, что нет никаких последствий для безопасности: даже если я загружаю код через SSL, вопрос о том, как его интерпретировать, по-прежнему стоит. – dpq