0

如果这是一个基本问题,我深表歉意,但我似乎无法在这里或谷歌上找到答案。基本上我正在尝试创建一个单一的配置模块,该模块可用于在 python 应用程序中导入的所有其他模块。当然,如果我import config在每个文件中都有它,但我想根据应用程序运行的环境使我的配置动态化,并且我不想将逻辑复制到每个文件中。

这是一个例子:

应用程序.py:

import config
import submodule

# do other stuff

子模块.py:

print config.some_config_variable

但是python当然会抱怨config没有定义。

我确实找到了一些关于全局变量的东西,但这似乎也不起作用。这是我尝试过的:

编辑我更改了它以表明我希望导入的实际配置是动态的。但是,我目前确实有一个用于测试的静态配置模型,只是为了弄清楚如何全局导入,然后担心该逻辑

应用程序.py

# logic here that defines some_dynamic_config
global config
config = __import__(some_dynamic_config)
import submodule

子模块.py

print config.some_config_variable

但是配置仍然没有定义。

我知道我可以创建一个 config.py 并放置逻辑来设置变量,但我不喜欢这样。我更喜欢配置文件只是配置而不包含一堆逻辑。

4

2 回答 2

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:

于 2012-07-30T22:20:29.957 回答
1

模块是共享的,因此每个模块都可以import config毫无问题。

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"

但是您需要先运行此代码,然后再使用它。空模块可以用作单例。

于 2012-07-30T21:47:34.693 回答