【问题标题】:python: I need to understand better imports and packagespython:我需要更好地理解导入和包
【发布时间】:2011-08-12 14:18:22
【问题描述】:

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

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。
我开始认为我还没有完全理解包之间的导入是如何工作的,我做错了什么?

谢谢!

【问题讨论】:

  • 这听起来像是 import pdb, pdb.set_trace() 的工作
  • 很好,我会调查一下,谢谢。
  • python 中的模块在某种程度上类似于单例。在你的pkg1.main() 行之后,但在你的pkg2.main() 行之前,你将拥有pkg1.msg == pkg1.mod1.bar == 'Hello World',但仍然是pkg2.mod2.foo is None(在导入时分配)

标签: python import package


【解决方案1】:

我花了一些时间来阅读所有代码,但看起来您的问题出在 pkg2/mod2.py 中。第一次导入该文件时执行foo = basemod.get_msg() 行,以后再也不执行了。所以当你改变mod1.bar的值时,这已经执行了,foo就是None

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

【讨论】:

  • 你说得完全正确,我非常确信这一定是导入的问题,所以我完全忽略了那条线。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多