python - 从单个导入访问 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() 初始化一些值并公开一些使用我的应用程序的方法,但这不是一个好的开始......
解决方案
您应该像global
在init
函数中一样声明变量,否则您只是在设置函数的一些局部变量来遮蔽全局变量:
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
...
推荐阅读
- angular - angularfirebase2查询键等于值的地方
- javascript - d3 鼠标悬停和点击事件与触摸
- css - 循环创建css关键帧
- sql - 用另一个表中的相关值替换数组列中的值
- javascript - 如何在fileList中插入文件?
- python - 创建 pm.Normal 变量时 pymc3 无法解释的 TypeError
- r - 如何在我的 R 包中插入新功能?
- go - `go run` 和 `go build` 的不同运行时长
- php - 我的样式没有被浏览器呈现。难道我做错了什么?
- swift - Xcode 在展开 Optional 时意外发现 nil,但不知道为什么