3

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

示例设置文件:

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

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

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

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

还是有更好的方法来做到这一点?

任何帮助表示赞赏。

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

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

4

4 回答 4

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 文件!

于 2012-11-07T22:18:37.950 回答
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"

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

于 2012-11-07T22:28:30.327 回答
1

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

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

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

PYTHONPATH=~/projects/pyutil/:$PYTHONPATH

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

于 2012-11-07T22:18:24.267 回答
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使它成为一个真正可重现的解决方案——将不同的设置分发为提供相同包名称的不同发行版。

于 2012-11-07T22:44:14.253 回答