在python中访问全局模块

在python中访问全局模块,python,import,module,Python,Import,Module,如果这是一个基本问题,我很抱歉,但我似乎无法在这里或谷歌上找到答案。基本上,我正在尝试创建一个配置模块,该模块可用于python应用程序中导入的所有其他模块。当然,如果我在每个文件中都有import config,它是可以工作的,但是我希望根据应用程序运行的环境使配置动态化,并且我不希望将逻辑复制到每个文件中 下面是一个例子: app.py: import config import submodule # do other stuff submodule.py: print config.

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

下面是一个例子:

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
子模块.py

print config.some_config_variable
但配置仍然没有定义


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

模块是共享的,因此每个模块都可以导入配置而不会出现问题

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"

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

模块是共享的,因此每个模块都可以导入配置而不会出现问题

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"

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

您必须将逻辑放在某个地方。您的
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中,并将特定于平台的设置放在各自的文件中。由于特定于平台的设置是在公共_设置之后导入的,因此您还可以通过在特定于平台的文件中再次定义来覆盖公共_设置中的任何内容

这是Django设置文件中使用的一种常见模式,在那里工作得很好


您还可以将每个
import
调用包装为
try。。。除了ImportError:
块(如果需要)。

您必须将逻辑放在某个地方。您的
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中,并将特定于平台的设置放在各自的文件中。由于特定于平台的设置是在公共_设置之后导入的,因此您还可以通过在特定于平台的文件中再次定义来覆盖公共_设置中的任何内容

这是Django设置文件中使用的一种常见模式,在那里工作得很好


您还可以将每个
import
调用包装为
try。。。除了ImportError:
如果需要可以阻止。

为什么不能在submodule.py中
导入config
?@cdhowie我可以,它的工作原理就是我希望能够动态地决定什么是“config”。我认为,正确的模式是在子模块中构造对象或调用该模块中的函数时传递config对象。(依赖项注入等)让子模块尝试查找配置比只将配置对象传递给需要使用的构造函数或函数要复杂和脆弱得多。为什么不能在submodule.py中
导入配置?@cdhowie我可以,它的工作原理就是我希望能够动态地决定需要什么“config”将是。我认为,正确的模式是在子模块中构造对象或调用该模块中的函数时传递config对象(依赖项注入等)让子模块尝试查找配置比将配置对象传递给您需要使用的任何构造函数或函数都要复杂和脆弱得多。但是,在运行时,放在config.py顶层的程序代码将无法访问,只能访问全局代码(函数在内部是全局变量),因此没有理由不将您的配置逻辑放在那里。我同意我可以这样做,但我特别尝试避免在配置文件中包含逻辑。在您的示例中,我更希望使用win32-config.py来处理windows特定的内容。正如我在文章的下半部分中提到的,您可以使用空模块,并在其中分配任何您喜欢的内容。您甚至可以让config.py do
从win32 config import*
将值从win32 config复制到config。(注意:import*有点凌乱,一般不应使用,但这可能不是一个坏用法)。但是,在运行时无法访问位于config.py顶层的程序代码,只能访问全局代码(函数在内部是全局变量),因此没有理由不将您的配置逻辑放在那里。我同意我可以这样做,但我特别尝试避免在配置文件中包含逻辑。在您的示例中,我更希望使用win32-config.py来处理windows特定的内容。正如我在文章的下半部分中提到的,您可以使用空模块,并在其中分配任何您喜欢的内容。您甚至可以从win32 config import*
中使用config.py do
来复制