2010-09-26 2 views
26

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

+0

Вы загружаете их через ssl или каждый доверенный доверенный маршрутизатор? : P – aaronasterling

+0

На самом деле, да - как хранилище модулей, так и внешний сервер являются частями одной системы (и даже расположены в одной и той же серверной комнате). Предположим, что нет никаких последствий для безопасности: даже если я загружаю код через SSL, вопрос о том, как его интерпретировать, по-прежнему стоит. – dpq

ответ

43

Похоже, что это следует сделать трюк: 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' …> 
>>> 
+0

Ницца, мне это интересно некоторое время. – intuited

+0

Есть ли трюк, чтобы я мог позволить пользователю «с foo import Foo»? В этом примере я получаю «ImportError: No module named foo». –

+0

См. Мой обновленный ответ. –

5

Вот что-то Некоторое время назад я добавил ссылку, которая покрывает нечто подобное:

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