跨模块的全局变量
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
就好了
我在到期时遇到了这个问题,我的 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
就好了