Python 跨模块的全局变量

Python 跨模块的全局变量,python,python-module,Python,Python Module,当我的项目即将到期时,我遇到了这个问题。我的项目设计为具有多个子模块 现在,每个子模块都需要屏幕上相同项目的位置,每次程序运行时都是随机的。我认为最好检查一次项目的位置(在运行时它不会改变),然后让所有模块访问该位置。(因为检查位置需要很长时间) 这就是我所做的: main.py Config.py 我尝试使用此代码,因此当我运行程序时,它将config.py模块pos变量设置为屏幕上项目的位置。 这段代码运行良好,但是当我尝试在子模块中使用它时,如下所示: sub_module.py 它会将值

当我的项目即将到期时,我遇到了这个问题。我的项目设计为具有多个子模块

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

这就是我所做的:

main.py Config.py 我尝试使用此代码,因此当我运行程序时,它将
config.py
模块
pos
变量设置为屏幕上项目的位置。
这段代码运行良好,但是当我尝试在子模块中使用它时,如下所示:

sub_module.py 它会将值重置为无,因为它会重新运行
Config
模块代码。
这个问题有一个优雅的解决方案吗?我不能让这一立场成为这个问题的论据,因为我的情况要复杂得多

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

谢谢你的帮助

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

mainPackage:
    __init__.py
    Config.py
    main.py
    b.py
    Packages:
        Package_A:
            __init__.py
            a.py
main.py 配置 b、 派克 a、 派克 输出
很抱歉给您带来不便,因为我不知道问题的原因,我感兴趣的是多包全局变量。

对于每个模块,请使用“pos”参数定义函数/类

模块A.py

def foo(pos):
    click(pos)
def main():
    position = get_pos()
    A.foo(position)
模块main.py

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

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

Config.py
仅在应用程序中导入时初始化一次,
pos
最初将为
None

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


Config.py

main.py

其余的文件可以按原样保存

更新

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

改变

from mainPackage import Config

为了避免另一个
Config
问题出现在a.py:
中:来自mainPackage import Config
。您从包中进行了绝对导入,最后导入了两次
Config
。Python只导入一个模块一次,但在您的示例中,您使用了两个不同的名称(
Config
在某些文件中,而在其他文件中,
mainPackage.Config
),这使Python感到困惑,它导入了模块两次—一次是通过包相对导入,一次是通过绝对导入。将
打印“Importing Config”
添加到Config.py,您将看到它打印了两次


只需将a.py更改为
import Config
,一切都会好起来。

感谢您的快速解决方案,这是一个可行的选项,但是否仍有其他选项,而不是将其作为参数添加?因为不是这样simple@DavidBarishev然后给出一个实际反映您正在尝试做的事情的例子-全局不太可能是正确的解决方案。您的问题的前提,如这行所示:“它将值重置为无,因为它将重新运行配置模块代码”是完全错误的。Python不会重新运行多次导入的模块。您的原始代码应该如图所示工作。您确定没有在real
sub_module.py
中从配置导入pos执行
?因为在
子模块
的导入时间,而不是调用
点击项目
函数时,它会获取
pos
的值。(您还显示
main()
在定义之前被调用。)是否尝试?是否每次导入都会重新运行一次?是的,我只是在做导入配置。上面的代码只是一个示例,不是实际的code@Padraic坎宁安:是的,这是我试图做的,但它在我的代码中不起作用-我将重新阅读一个位,并编写一个工作示例来说明问题!你犯了一些小错误,我们可以帮你解决——但如果你只是在垃圾堆上,而你没有费心运行自己的非工作示例,那就不会了。我注意到在main.py中,您在定义它之前调用了
main
。那不行。我们怎么能在这么多人身上发现真正的错误?!看看我的书example@DavidBarishev您已在
Config.py
中将
pos
重命名为
Position
,并尝试访问不再存在的
Config.pos
。很抱歉,我添加了另一个示例来说明我的情况,我终于找到了问题,请看一看look@DavidBarishev参见tdelaney的答案。
import Config

def print_val():
    print Config.Position
from mainPackage import Config

def print_val():
    print Config.Position
None -> from Package_A
(124, 586) -> from b.py
def foo(pos):
    click(pos)
def main():
    position = get_pos()
    A.foo(position)
# Initial value
pos = None
import Config
import sub_module

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