首页 > 解决方案 > 从单个导入访问 python 应用程序中的全局变量

问题描述

所以,我想做的是使用 python 解释器作为我的服务器端 python 应用程序的 CLI。但是,我在加载 python 模块时遇到了我没想到的行为。

我有两个 python 文件和一个缓存文件:

Main.py
Config.py
Cache.json

那么会发生的是,当 Main 被导入并运行时,main() 函数会导入 Configs,然后调用一个函数来初始化 Config。初始化 Config 时,根据我运行的环境从 Cache.json 加载一些全局变量。这是 .py 的简化示例。

#Main.py
import Config

def main():
    """Initialize Python Application"""
    Config.init()


if __name__ == "__main__":
    main()

#Config.py
import os
import json

Default_MSSQLPassword = ""
Default_MSSQLUser = ""
Default_OdbccDriver = ""
MDGSQLP01 = ""


def init():
    """docstring"""

    with open("Cache.json", "r") as f:
        dtGlobalConstants = json.load(f)

    Default_MSSQLPassword = dtGlobalConstants["Default_MSSQLPassword"]
    Default_MSSQLUser = dtGlobalConstants["Default_MSSQLUser"]
    Default_OdbccDriver = dtGlobalConstants["Default_OdbccDriver"]
    MDGSQLP01 = dtGlobalConstants["MDGSQLP01"]

现在理论上,如果我在 python 解释器中调用以下内容:

>>>from Main import main
>>>main()

配置应该由 main() 导入,持久化,并且我应该能够打印从 Cache.json 加载的 Default_OdbccDriver 的缓存值。但相反,我得到了这个:

>>>Config.Default_OdbccDriver
>>>''

很明显 Main 正在导入 Config.py,否则我在调用属性 .Default_OdbccDriver 时会出错。但是,即使 Default_OdbccDriver 的值应该是“全局的”(根据 python 对这个词的奇怪定义),它的值也应该是静态的,并且保留在导入缓存中。

任何人都知道发生了什么或如何解决它?最后,我希望 main() 初始化一些值并公开一些使用我的应用程序的方法,但这不是一个好的开始......

标签: pythonglobal-variables

解决方案


您应该像globalinit函数中一样声明变量,否则您只是在设置函数的一些局部变量来遮蔽全局变量:

def init():
    """docstring"""
    global Default_MSSQLPassword
    global Default_MSSQLUser
    global Default_OdbccDriver
    global MDGSQLP01

    with open("Cache.json", "r") as f:
        dtGlobalConstants = json.load(f)

    Default_MSSQLPassword = dtGlobalConstants["Default_MSSQLPassword"]
    Default_MSSQLUser = dtGlobalConstants["Default_MSSQLUser"]
    Default_OdbccDriver = dtGlobalConstants["Default_OdbccDriver"]
    MDGSQLP01 = dtGlobalConstants["MDGSQLP01"] 

正如您在评论中所说,在导入会话时绑定变量以Main.Config.your_var_name解决此问题应该足以在模块中将它们声明为全局:

#Config.py
import os
import json

global Default_MSSQLPassword
global Default_MSSQLUser
global Default_OdbccDriver
global MDGSQLP01

Default_MSSQLPassword = ""
Default_MSSQLUser = ""
Default_OdbccDriver = ""
MDGSQLP01 = ""


def init():
    """docstring"""
    global Default_MSSQLPassword
    global Default_MSSQLUser
    global Default_OdbccDriver
    ...

推荐阅读