从主(导入)文件中获取函数?

Get function from master(importing) file?

假设我有一个很长的脚本。(在我的例子中,超过 1000 行)所以我将它分成单独的文件:

main.py #the file i execute
foo1.py #a file my main.py imports
foo2.py #a file imported by foo1.py

(注意:main.py 导入多个文件,而不只是一个) Foo1.py 持有 Tkinter,以及与之相关的东西,而 Foo2.py 持有一个巨大的对象 class,其功能与 class.

相关

我的问题如下:

而且我无法将该函数导入到 Foo2 中,因为 Foo1 已经有了它,这会引发导入错误。

当两个模块相互导入时,您需要记住一些事情,以便在需要之前定义所有内容。

首先让我们考虑导入的机制:

  • 当第一次导入模块时,一个条目被添加到 sys.modules 并且定义文件开始执行(暂停执行 import-er)
  • 后续导入将只使用 sys.modules 中的条目 - 无论文件是否完成执行

所以假设模块 A 首先加载,导入模块 B 然后导入模块 A,当这种情况发生时执行如下:

  1. A 是第一次从其他东西导入,A 添加到 sys.modules
  2. A 执行到导入 B
  3. B 添加到 sys.modules
  4. B被执行:
    • 当它导入 A 时,部分加载的模块来自 sys.modules
    • B 在恢复之前完全运行
  5. A 恢复执行,可以访问完整的模块 B

*1 所以 from A import x 只有在 import B 之前的 A 中定义了 x 才能工作,只需使用 import A 就会给你模块对象它会随着文件的执行而更新,因此虽然它可能不会在导入后立即拥有所有定义,但当文件有机会完成执行时它就会拥有。


所以解决这个问题的最简单方法是首先不依赖导入来执行模块 - 这意味着循环导入的所有使用都在 def 块中,这些块不是从模块调用的执行水平。