2010-09-26 45 views
26

Tengo un servidor remoto de confianza que almacena muchos módulos de Python personalizado. Puedo buscarlos a través de HTTP (por ejemplo, usando urllib2.urlopen) como texto/simple, pero no puedo guardar el código del módulo obtenido en el disco duro local. ¿Cómo puedo importar el código como un módulo de Python totalmente operativo, incluidas sus variables globales e importaciones?
supongo que tengo que usar una combinación de exec y imp funciones del módulo, pero he sido incapaz de hacerlo aún funciona.dinámicamente importar módulo de Python

+0

se les descarga a través de SSL o está cada router intermedias de confianza así? : P – aaronasterling

+0

En realidad, sí, tanto el módulo de almacenamiento como el servidor de aplicaciones para el usuario son partes de un único sistema (e incluso se encuentran en la misma sala de servidores). Por ahora, supongamos que no hay implicaciones de seguridad: incluso si descargo el código a través de SSL, la cuestión de cómo interpretarlo sigue en pie. – dpq

Respuesta

43

Parece que este debe hacer el truco: 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' 
>>> 

También, como se sugiere en el artículo ActiveState, es posible que desee agregar su nuevo módulo de sys.modules:

 
>>> import sys 
>>> sys.modules["foo"] = foo 
>>> from foo import Foo 
<class 'Foo' …> 
>>> 
+0

Bien, me he estado preguntando sobre esto por un tiempo. – intuited

+0

¿Hay algún truco para que yo pueda permitir al usuario "desde foo importar Foo"? En este ejemplo, obtengo "ImportError: ningún módulo llamado foo". –

+0

Ver mi respuesta actualizada. –

Cuestiones relacionadas