2009-10-23 57 views
1

我想用我的Django系統中的settings.py替換爲settings包含__init__.py的模塊。這將嘗試導入以服務器命名的模塊,從而允許按服務器進行設置。我如何使用Python的__import__函數'foo import *'

如果我在導入模塊之前不知道模塊的名稱,那麼我不能使用import關鍵字,而必須使用__import__函數。但是這不會將模塊的內容添加到settings模塊。我需要相當於from MACHINE_NAME import *。或者我需要一種方法來遍歷vars(m)(其中m是加載的模塊)並將它們添加到當前名稱空間。但我無法弄清楚如何引用當前命名空間來完成分配。換句話說,我不能使用setattr(x, ..)或修改x.__dict__,因爲我不知道x使用什麼。

除了使用exec之外,我現在想不出別的辦法了。這對我來說似乎有點虛弱。我是否錯過了Pythonic內省的某些方面,這將允許我在處理當前範圍的同時操作它?

+1

此處完全重複:http://stackoverflow.com/questions/147507/how-does-one-do-the-equivalent-of-import-from-module-with-pythons-import – u0b34a0f6ae 2009-10-23 18:04:14

+1

謝謝 - 我做了嘗試搜索它,誠實,但當下劃線被剝離,__import__不是一個非常具體的搜索術語... :-) – pdc 2009-10-23 18:41:02

回答

1

對於類似的情況下根據郎設定我導入messages.py模塊在不同的消息是像

# set values in current namespace 
for name in vars(messages): 
    v = getattr(messages, name) 
    globals()[name] = v 

順便說一下,爲什麼你要創建一個包settings.py?無論你想要做什麼都可以直接在settings.py中完成?

+0

最重要的是保持每臺機器配置文件在他們自己的目錄,所以唐不要把應用程序的其餘部分弄亂。既然將會有一個目錄涉及到任何一種方式,將__init__.py放在那裏似乎是合理的... – pdc 2009-10-23 18:37:08

+0

但是,最重要的是globals()是當前的命名空間 - 它甚至在文檔 - 但我總是模糊地認爲它是'top'命名空間,這是錯誤的。 – pdc 2009-10-23 18:39:06

相關問題