2010-09-26 209 views
26

我有一个可信的远程服务器,它存储了很多自定义的Python模块。我可以通过HTTP(例如使用urllib2.urlopen)作为文本/纯文本获取它们,但我无法将提取的模块代码保存到本地硬盘。如何将代码作为完全可操作的Python模块导入,包括其全局变量和导入?
我想我必须使用execimp模块功能的组合,但我一直无法使它工作。动态导入Python模块

+0

你是通过SSL下载它们,还是每个中间路由器都可信? :P – aaronasterling 2010-09-26 19:58:53

+0

实际上,是的 - 模块存储和前端服务器都是单个系统的一部分(甚至位于同一个服务器机房中)。现在,假设没有安全隐患:即使我通过SSL下载代码,如何解释它的问题依然存在。 – dpq 2010-09-26 20:04:30

回答

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 2010-09-26 23:29:46

+0

是否有一招让我可以让用户“从foo导入Foo”?在这个例子中,我得到“ImportError:No module named foo”。 – 2013-03-04 15:29:06

+0

查看我更新的答案。 – 2013-03-04 15:41:13