如果这是一个基本问题我很抱歉,但我似乎无法在此处或在Google上找到答案。基本上我正在尝试创建一个可用于python应用程序中导入的所有其他模块的配置模块。当然,如果我在每个文件中都有import config
,但我想根据运行应用程序的环境使我的配置动态,并且我不希望将逻辑复制到每个文件中。 / p>
以下是一个例子:
app.py:
import config
import submodule
# do other stuff
submodule.py:
print config.some_config_variable
但是python当然抱怨config
没有定义。
我确实找到了一些关于全局变量的东西,但这似乎也没有用。这是我试过的:
编辑我对此进行了更改,以表明我希望导入的实际配置是动态的。但是我现在有一个静态配置模型用于我的测试只是为了弄清楚如何全局导入然后担心这个逻辑
app.py
# logic here that defines some_dynamic_config
global config
config = __import__(some_dynamic_config)
import submodule
submodule.py
print config.some_config_variable
但是配置仍未定义。
我知道我可以创建一个config.py并设置逻辑来设置变量,但我不喜欢这样。我更喜欢配置文件只是配置而不包含一堆逻辑。
答案 0 :(得分:3)
你必须把你的逻辑放在某个地方。您的config.py
可能是一个模块,用于确定要加载的配置文件,如下所示:
#config.py
import sys
from common_config import *
if sys.platform == 'darwin':
from mac_config import *
elif sys.platform == 'win32':
from win32_config import *
else:
from linux_config import *
使用此方法,您可以将common_settings.py中的常用设置和特定于平台的设置放在各自的文件中。由于特定于平台的设置是在common_settings之后导入的,因此您还可以通过在特定于平台的文件中再次定义它来覆盖common_settings中的任何内容。
这是Django设置文件中使用的常见模式,在那里效果很好。
如果需要,您还可以使用import
块封装每个try... except ImportError:
来电。
答案 1 :(得分:1)
模块是共享的,因此每个模块都可以import config
没有问题。
config.py本身可以有逻辑来设置它的全局变量,无论你喜欢什么。举个例子:
config.py:
import sys
if sys.platform == "win32":
temp = "c:\\temp"
else:
temp = "/tmp"
现在在任何模块中导入配置以使用它:
import config
print "Using tmp dir: %s" % config.temp
如果你有一个你知道的模块将在其他任何东西之前被初始化,你可以创建一个空的config.py,然后在外部设置它:
import config
config.temp = "c:\\temp"
但是您需要在使用它之前运行此代码。空模块可以用作单例。