我正在尝试使用* .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等。
我不想手动更改导入位置,以便更改整个应用程序中导入的内容。
答案 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
使其成为真正可重复的解决方案 - 将不同的设置分配为提供相同包名称的不同发行版。