跨模块的全局变量

Global Variable across modules

我在到期时遇到了这个问题,我的 project.My 项目设计为具有多个子模块。

现在每个子模块都需要一个相同项目在屏幕上的位置,每次程序 运行dom 认为检查一次位置是个好主意项目的(它在运行时不会改变),并让所有模块访问该位置。(因为检查位置需要很长时间)

这就是我所做的:

main.py

import Config
import sub_module

main()

def main():
    position = get_pos()
    Config.pos = position
    sub_module.click_on_item()

Config.py

pos = None

我尝试使用此代码,所以当我 运行 程序时,它将 config.py 模块 pos 变量设置为项目在屏幕上的位置。
这段代码工作正常 但是 当我尝试在这样的子模块中使用它时:

sub_module.py

import Config

def click_on_item():
    click(Config.pos)

它将值重置为 None ,因为它重新运行了 Config 模块代码。
这个问题有一个优雅的解决方案吗?我不能让 position 作为 的参数,因为我的情况要复杂得多。

我能想到的一种解决方案是写入磁盘,然后重新读取,但速度不快。

感谢您的帮助。

2 编辑:

我的项目是多包的,有问题 这是目录树:

mainPackage:
    __init__.py
    Config.py
    main.py
    b.py
    Packages:
        Package_A:
            __init__.py
            a.py

main.py

import Config
from Packages.Package_A import a
import b

def main():
    Config.Position = (124, 586)
    a.print_val()
    b.print_val()

if __name__ == '__main__':
    main()

配置

Position = None

b.py

import Config

def print_val():
    print Config.Position

a.py

from mainPackage import Config

def print_val():
    print Config.Position

输出

None -> from Package_A
(124, 586) -> from b.py

很抱歉给您带来不便,因为我不知道是什么导致了这个问题,我的兴趣是多包全局变量。

对于您的每个模块,使用 'pos' 参数定义您的 functions/class。

模块A.py

def foo(pos):
    click(pos)

模块main.py

def main():
    position = get_pos()
    A.foo(position)

一般情况下,不要使用全局变量

Config.py 只会在您的应用程序导入时初始化一次,pos 最初会是 None.

main.py然后设置它,所有其他模块可以通过Config.pos访问pos


Config.py

# Initial value
pos = None

main.py

import Config
import sub_module

def main():
    position = get_pos()
    Config.pos = position
    sub_module.click_on_item()

您的其余文件可以保持原样。

更新

正如@tdelaney 在他的回答中提到的那样。

改变

from mainPackage import Config

import Config

避免另一个Config

问题在 a.py: from mainPackage import Config。您从包中进行了绝对导入,最终导入了 Config 两次。 Python 只导入一次模块,但在你的情况下你使用了两个不同的名称(Config 在一些文件中,mainPackage.Config 在其他文件中)混淆了 python 并且它导入了模块两次- 一次通过包相对导入,一次通过绝对导入。将 print "Importing Config" 添加到 Config.py,您将看到它打印了两次。

a.py改成import Config就好了