python:我需要了解更好的导入和包

kyn*_*kos 2 python import package

我的应用程序具有与此类似的结构:

myapp.py
basemod.py
[pkg1]
    __init__.py
    mod1.py
[pkg2]
    __init__.py
    mod2.py
Run Code Online (Sandbox Code Playgroud)

myapp.py:

import pkg1
import pkg2

if __name__ == '__main__':
    pkg1.main()
    pkg2.main()
Run Code Online (Sandbox Code Playgroud)

basemod.py:

import pkg1


def get_msg():
    return pkg1.msg
Run Code Online (Sandbox Code Playgroud)

pkg1/__init__.py:

import mod1

msg = None


def main():
    global msg
    mod1.set_bar()
    msg = mod1.bar
Run Code Online (Sandbox Code Playgroud)

pkg1/mod1.py:

bar = None


def set_bar():
    global bar
    bar = 'Hello World'
Run Code Online (Sandbox Code Playgroud)

pkg2/__init__.py:

import mod2


def main():
    mod2.print_foo()
Run Code Online (Sandbox Code Playgroud)

pkg2/mod2.py:

import basemod

foo = basemod.get_msg()


def print_foo():
    print(foo)
Run Code Online (Sandbox Code Playgroud)

如果我跑,myapp.py我得到:

None
Run Code Online (Sandbox Code Playgroud)

在我看来,我期待:

Hello World
Run Code Online (Sandbox Code Playgroud)

我的目标是保持两个包完全独立,并且只通过通信basemod.py,这是一种API pkg1.
我开始认为我还没有完全理解包中的导入是如何工作的,我做错了什么?

谢谢!

Dan*_*man 5

我花了一些时间来阅读所有代码,但看起来你的问题是pkg2/mod2.py.该行在foo = basemod.get_msg()第一次导入文件时执行,而不会再次执行.所以当你改变它的值时mod1.bar,它已经执行了,而且fooNone.

解决方案应该只是将该行移动到print_foo函数中,因此只有在调用该函数时才执行它 - 这是在设置相关值的代码之后.