模块间的全局变量

时间:2016-06-18 16:28:56

标签: python python-module

当我的项目失效时,我遇到了这个问题。我的项目设计得如此,它有多个子模块。

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

这就是我所做的:

主要的.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模块代码 这个问题有优雅的解决方案吗?我不能把这个位置作为论据,因为我的情况要复杂得多。

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

感谢您的帮助。

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

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

3 个答案:

答案 0 :(得分:1)

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

只需将 a.py 更改为import Config即可。

答案 1 :(得分:0)

Config.py只会在您的应用中导入一次后被初始化,pos最初会None

然后

main.py设置它,所有其他模块都可以pos访问Config.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

答案 2 :(得分:-1)

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

模块A.py

def foo(pos):
    click(pos)

模块main.py

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

一般情况下,请勿使用global var。

相关问题