当我的项目失效时,我遇到了这个问题。我的项目设计得如此,它有多个子模块。
现在每个子模块需要屏幕上同一项目的位置,每次程序运行时都是随机的。我认为最好先检查项目的位置(不会改变)运行时),让所有模块访问该位置。(因为检查位置需要很长时间)
这就是我所做的:
import Config
import sub_module
main()
def main():
position = get_pos()
Config.pos = position
sub_module.click_on_item()
pos = None
我尝试使用此代码,因此当我运行程序时,它会将config.py
模块pos
变量设置为屏幕上项目的位置。
当我尝试在子模块中使用它时,此代码可以正常但:
import Config
def click_on_item():
click(Config.pos)
它将值重置为None,因为它重新运行Config
模块代码
这个问题有优雅的解决方案吗?我不能把这个位置作为论据,因为我的情况要复杂得多。
我能想到的一个解决方案是写入磁盘并重新读取,但速度不快。
感谢您的帮助。
我的项目是多包,有问题 这是目录树:
mainPackage:
__init__.py
Config.py
main.py
b.py
Packages:
Package_A:
__init__.py
a.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
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
很抱歉给我带来不便,因为我不知道是什么导致了这个问题,我的兴趣在于多包全局变量。
答案 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。