Dinámicamente la importación de módulo de Python
-
05-10-2019 - |
Pregunta
Tengo un servidor remoto de confianza que almacena módulos de Python muchas personalizados. Puedo traerlos a través de HTTP (por ejemplo, utilizando urllib2.urlopen
), text / plain, pero no puedo guardar el código del módulo exagerado en el disco duro local. ¿Cómo puedo importar el código como un módulo completamente operable Python, incluyendo sus variables y las importaciones mundiales?
Supongo que tengo que usar una combinación de funciones y exec
imp
del módulo, pero he sido incapaz de hacerlo aún funciona.
Solución
Parece que este debe hacer el truco: la importación de un dinámicamente generada módulo
>>> import imp >>> foo = imp.new_module("foo") >>> foo_code = """ ... class Foo: ... pass ... """ >>> exec foo_code in foo.__dict__ >>> foo.Foo.__module__ 'foo' >>>
Además, como se sugiere en el artículo ActiveState, es posible que desee añadir el nuevo módulo para sys.modules
:
>>> import sys >>> sys.modules["foo"] = foo >>> from foo import Foo <class 'Foo' …> >>>
Otros consejos
A continuación de algo que bookmarked un tiempo que cubre algo similar:
- Personalización de la sistema de importación de Python
Es un poco más allá de lo que quiera, pero la idea básica es que hay.