Python导入类似于Django设置文件

Python导入类似于Django设置文件,python,django,Python,Django,我尝试使用*.py文件从python应用程序中的多个导入中获取变量,并在多个导入中使用它们,类似于Django设置文件的工作方式 示例设置文件: DB_NAME = 'foo' DB_TABLE = 'bar' #Lots of other variable names and values here 这样做的好处是我可以很快地加载不同的设置。我可以在任何地方引用一种全局DB_名称,而无需处理特定对象 缺点是我必须在每个必须导入它们的文件中更改import语句 我可以将其设置为只导入一次文件,

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

示例设置文件:

DB_NAME = 'foo'
DB_TABLE = 'bar'
#Lots of other variable names and values here
这样做的好处是我可以很快地加载不同的设置。我可以在任何地方引用一种全局DB_名称,而无需处理特定对象

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

我可以将其设置为只导入一次文件,然后引用通用导入来获取所有这些值吗

还是有更好的方法

感谢您的帮助

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


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

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

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

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

PYTHONPATH=~/projects/pyutil/:$PYTHONPATH

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

在文件夹中创建我们自己的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'}
别忘了你的_uinit__uu.py文件

您可以使用模块内置:

文件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中设置一次元素,然后在任何其他加载的模块中按名称访问它

问题源于有多个设置文件

如果您希望能够对多个模块进行别名,有两种解决方案:

try: 
    import test_settings as settings
except ImportError:
    import default_settings as settings
注意,您不必使用模块的存在/不存在,您可以使用任何流控制来选择正确的导入语句

此外,正如建议的那样,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

最后,考虑diStudis使这是一个真正可重复的解决方案-将不同的设置分布为不同的分布,提供相同的包名。< / P>我不确定我理解这个问题。每个Python模块只是一个名称空间。如果您有类似mypacakge/settings.py的内容,只需从中编写即可。导入设置,然后访问您的选项,如settings.DB_NAME等。我不确定是否理解您的答案。我已经更新了我的问题。如果这更有意义,请告诉我。除非你有很好的理由,否则不要那样做。。这种方式是疯狂的。如果小心使用,它是完全合法的,可以解决问题。谢谢!这正是我想要的!谢谢你的回答。恐怕我不明白您使用任何流控件来选择正确的导入语句是什么意思。如果目录中存在所有设置文件,它是否总是默认为列出的第一个文件?try:/except:示例将首先搜索名为test_settings.py的文件,如果不存在,将查找default_settings.py。但您可以使用if is_monday:将测试设置作为设置导入;其他:将默认设置导入为设置