2012-11-07 20 views
3

我想使用* .py文件從我的python應用程序中的多個導入中獲取變量並使用它們,這與Django設置文件的工作方式類似。類似於Django設置文件的Python導入

一個例子設置文件:

DB_NAME = 'foo' 
DB_TABLE = 'bar' 
#Lots of other variable names and values here 

的好處是,我可以非常迅速地加載不同的設置,這種方式。我可以在無需處理特定對象的情況下,在任何我想要的地方引用某種全局「DB_NAME」。

缺點是我必須在每個必須導入它們的文件中更改導入語句。

我可以設置它,以便導入一次文件,然後引用通用導入以獲取所有這些值嗎?

還是有更好的方法來做到這一點?

任何幫助表示讚賞。

編輯:問題源於有多個設置文件。我將不得不導入settings.py爲一個文件,或者如果我想要一個不同的設置文件,我將需要更改所有導入語句以引用test_settings.py等。

我不想手動更改導入位置以更改在整個應用程序中導入的內容。

+2

我不確定我是否理解這個問題。每個Python模塊只是一個名稱空間。如果你有像mypacakge/settings.py這樣的東西,只需寫'from。導入設置「,然後訪問像」settings.DB_NAME「等選項。 – Iguananaut

+0

我不確定我是否理解你的答案。我更新了我的問題。請讓我知道它是否更有意義。 – metalcharms

回答

4

一個文件夾中創建自己的config.py文件

settings = {} 
settings['server'] = '172.16.150.106:1433' 
settings['user'] = 'pyadmin' 
settings['password'] = 'admin' 
settings['db'] = 'SQLSERV_2005' 

開殼(IPython中)

In [1]: from config import settings 

In [2]: print settings 
{'password': 'admin', 'db': 'SQLSERV_2005', 'user': 'pyadmin', 'server': '172.16.150.106:1433'} 

不要忘記你的__init__.py文件!

+0

謝謝!這正是我想要的! – metalcharms

1

基本上你想擁有一個全局可用的模塊。

有幾種方法可以做到這一點,如Python module search path docs中所述。實質上,如果您可以將全局模塊置於您的sys.path搜索路徑下,則可以在用戶環境中的機器上的任何位置訪問它。 (請注意,您也可以將模塊添加到wsgi服務器的sys.path中。)

我通過我的.bashrc文件向我的PYTHONPATH環境變量添加了一些模塊;例如:

PYTHONPATH=~/projects/pyutil/:$PYTHONPATH 

您也可在此之前導入模塊通過增加進口sys.path發生之前添加到任何Python程序的搜索路徑。

2

您可以使用模塊__builtin__

文件a.py:

#!/usr/bin/env python 
import __builtin__ 
import b 

if __name__ == "__main__": 
    import conf 
    __builtin__.__dict__["CONF"] = conf 

    print "IN A: %s" % CONF.VAR 

    b.test_conf() 

文件b.py:

def test_conf(): 
    print "IN B: %s" % CONF.VAR 

文件的conf。潘岳:

VAR =「VAL」

所以基本上你需要設置一個元素在一次內建字典,然後按名稱訪問它在任何其他加載的模塊。

+0

除非你有很好的理由,否則不要這樣做。這種方式就是瘋狂。 – Iguananaut

+0

如果小心使用它是完全合法的並且解決問題。 – 2012-11-08 01:07:25

1

問題不必多設置莖文件

如果你希望能夠別名多個模塊,有一對夫婦的解決方案:

try: 
    import test_settings as settings 
except ImportError: 
    import default_settings as settings 

請注意,你不這樣做必須使用存在/不存在的模塊,您可以使用您喜歡的任何流量控制來選擇正確的import聲明。

此外,作爲建議,PYTHONPATH可以/應該用來針對不同的設置:

# code just does "import settings" and there's a settings.py in each /opt/{test,default}_settings 
    PYTHONPATH=/opt/test_settings ./my_app 
    PYTHONPATH=/opt/default_settings ./my_app 

最後,考慮distutils使這一個真正可重複的解決方案 - 分配的不同設置不同的分派提供相同的包名稱。

+0

感謝您的回答。我害怕我不明白你的意思是「使用任何流量控制來選擇正確的導入語句」。如果目錄中存在所有設置文件,是不是會默認列出第一個文件? – metalcharms

+0

'try:'/'except:'例子將首先搜索名爲'test_settings.py'的文件,如果不存在,則會查找'default_settings.py'。但是你可以使用'if is_monday:import test_settings作爲設置; else:import default_settings as settings' –

+0

好吧,我現在明白了。謝謝! – metalcharms