我的应用程序的结构与此类似:
myapp.py
basemod.py
[pkg1]
__init__.py
mod1.py
[pkg2]
__init__.py
mod2.py
myapp.py
:
import pkg1
import pkg2
if __name__ == '__main__':
pkg1.main()
pkg2.main()
basemod.py
:
import pkg1
def get_msg():
return pkg1.msg
pkg1/__init__.py
:
import mod1
msg = None
def main():
global msg
mod1.set_bar()
msg = mod1.bar
pkg1/mod1.py
:
bar = None
def set_bar():
global bar
bar = 'Hello World'
pkg2/__init__.py
:
import mod2
def main():
mod2.print_foo()
pkg2/mod2.py
:
import basemod
foo = basemod.get_msg()
def print_foo():
print(foo)
如果我运行 myapp.py
我得到:
None
虽然在我看来我期望:
Hello World
我的目标是让两个包完全独立,并且仅通过 basemod.py
进行通信,这是 pkg1
的一种 API。
我开始认为我还没有完全理解包之间的导入是如何工作的,我做错了什么?
谢谢!
最佳答案
我花了一些时间阅读所有代码,但看起来你的问题出在 pkg2/mod2.py 中。行 foo = basemod.get_msg()
在第一次导入该文件时执行,并且不再执行。因此,当您更改 mod1.bar
的值时,它已经执行,并且 foo
为 None
。
解决方案应该只是将该行移动到 print_foo
函数中,因此它仅在调用该函数时执行 - 即在设置相关值的代码之后。
关于python:我需要更好地理解导入和包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041436/