Python导入类似于Django设置文件

时间:2012-11-07 21:50:42

标签: python django

我正在尝试使用* .py文件从我的python应用程序中的多个导入中获取变量并使用它们,类似于Django设置文件的工作方式。

示例设置文件:

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

好处是我可以通过这种方式快速加载不同的设置。我可以在任何地方引用一种全局“DB_NAME”而无需处理特定对象。

缺点是我必须在每个必须导入它们的文件中更改import语句。

我可以进行设置,以便我导入一次文件,然后引用通用导入来获取所有这些值吗?

或者有更好的方法吗?

感谢任何帮助。

编辑:问题源于拥有多个设置文件。我必须为一个文件导入settings.py,或者如果我想要一个不同的设置文件,我需要更改所有import语句以引用test_settings.py等。

我不想手动更改导入位置,以便更改整个应用程序中导入的内容。

4 个答案:

答案 0 :(得分:4)

在文件夹

中创建我们自己的config.py文件
settings = {}
settings['server'] = '172.16.150.106:1433'
settings['user'] = 'pyadmin'
settings['password'] = 'admin'
settings['db'] = 'SQLSERV_2005' 

打开shell(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文件!

答案 1 :(得分: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.py:

VAR =“VAL”

所以基本上你需要在内置的dict中设置一个元素,然后按名称在任何其他加载的模块中访问它。

答案 2 :(得分:1)

基本上,您希望拥有一个全局可用的模块。

Python module search path docs所述,有几种方法可以做到这一点。基本上,如果您可以将全局模块放在sys.path搜索路径下,则可以在用户环境中的计算机上的任何位置访问它。 (请注意,您也可以为wsgi服务器的sys.path添加模块。)

我通过我的.bashrc文件向我的PYTHONPATH环境变量添加了一些模块;例如:

PYTHONPATH=~/projects/pyutil/:$PYTHONPATH

您还可以在导入模块之前添加到任何python程序的搜索路径,方法是在导入之前添加到sys.path

答案 3 :(得分: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使其成为真正可重复的解决方案 - 将不同的设置分配为提供相同包名称的不同发行版。