python:我需要更好地理解导入和包

标签 python import package

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

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 的值时,它已经执行,并且 fooNone

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

关于python:我需要更好地理解导入和包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041436/

相关文章:

r - r修改并重建软件包

python - 如何使数据帧列表的长度全部相等

python - Pandas:将滚动统计添加到所有列的数据框中

mysql - 如何在没有索引的情况下导出/转储 mysql

用于版本控制外部 API 的 Java 包命名

php - 如何在laravel包中给出资源路径?

python - Pandas :如何用平均值填充缺失数据?

python - 我想在 Python 中创建一个包含值和颜色属性的 2D 列表

import - 开 Jest : Cannot use import statement outside a module

python - 导入外部包的正确约定是什么?