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