动态导入Python模块

时间:2010-09-26 19:57:18

标签: python dynamic-import

我有一个可信赖的远程服务器,可存储许多自定义Python模块。我可以通过HTTP(例如使用urllib2.urlopen)作为text / plain获取它们,但是我无法将获取的模块代码保存到本地硬盘。如何将代码作为完全可操作的Python模块导入,包括其全局变量和导入?
我想我必须使用execimp模块函数的某种组合,但我还是无法使它工作。

3 个答案:

答案 0 :(得分:45)

看起来这应该可以解决问题: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' …>
>>>

答案 1 :(得分:5)

这是我在一段时间后书签的东西,涵盖类似的内容:

这有点超出你想要的范围,但基本的想法就在那里。

答案 2 :(得分:0)

Python3 版本
(试图编辑其他答案,但编辑队列已满)

import imp

my_dynamic_module = imp.new_module("my_dynamic_module")
exec("""
class Foo:
    pass
""", my_dynamic_module.__dict__)

Foo = my_dynamic_module.Foo
foo_object = Foo()

# register it on sys
import sys
sys.modules[my_dynamic_module.__name__] = my_dynamic_module