2010-09-26 208 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