从主(导入)文件中获取函数?
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.
相关
我的问题如下:
- Foo1 导入 Foo2
- Foo2 运行一个从 Foo1 调用另一个函数的函数
- Foo2 引发 'global name ' 未定义错误
而且我无法将该函数导入到 Foo2 中,因为 Foo1 已经有了它,这会引发导入错误。
当两个模块相互导入时,您需要记住一些事情,以便在需要之前定义所有内容。
首先让我们考虑导入的机制:
- 当第一次导入模块时,一个条目被添加到
sys.modules
并且定义文件开始执行(暂停执行 import-er)
- 后续导入将只使用
sys.modules
中的条目 - 无论文件是否完成执行
所以假设模块 A
首先加载,导入模块 B
然后导入模块 A
,当这种情况发生时执行如下:
A
是第一次从其他东西导入,A
添加到 sys.modules
A
执行到导入 B
B
添加到 sys.modules
B
被执行:
- 当它导入
A
时,部分加载的模块来自 sys.modules
B
在恢复之前完全运行
A
恢复执行,可以访问完整的模块 B
*1 所以 from A import x
只有在 import B
之前的 A
中定义了 x
才能工作,只需使用 import A
就会给你模块对象它会随着文件的执行而更新,因此虽然它可能不会在导入后立即拥有所有定义,但当文件有机会完成执行时它就会拥有。
所以解决这个问题的最简单方法是首先不依赖导入来执行模块 - 这意味着循环导入的所有使用都在 def
块中,这些块不是从模块调用的执行水平。
假设我有一个很长的脚本。(在我的例子中,超过 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.
相关我的问题如下:
- Foo1 导入 Foo2
- Foo2 运行一个从 Foo1 调用另一个函数的函数
- Foo2 引发 'global name ' 未定义错误
而且我无法将该函数导入到 Foo2 中,因为 Foo1 已经有了它,这会引发导入错误。
当两个模块相互导入时,您需要记住一些事情,以便在需要之前定义所有内容。
首先让我们考虑导入的机制:
- 当第一次导入模块时,一个条目被添加到
sys.modules
并且定义文件开始执行(暂停执行 import-er) - 后续导入将只使用
sys.modules
中的条目 - 无论文件是否完成执行
所以假设模块 A
首先加载,导入模块 B
然后导入模块 A
,当这种情况发生时执行如下:
A
是第一次从其他东西导入,A
添加到sys.modules
A
执行到导入B
B
添加到sys.modules
B
被执行:- 当它导入
A
时,部分加载的模块来自sys.modules
B
在恢复之前完全运行
- 当它导入
A
恢复执行,可以访问完整的模块B
*1 所以 from A import x
只有在 import B
之前的 A
中定义了 x
才能工作,只需使用 import A
就会给你模块对象它会随着文件的执行而更新,因此虽然它可能不会在导入后立即拥有所有定义,但当文件有机会完成执行时它就会拥有。
所以解决这个问题的最简单方法是首先不依赖导入来执行模块 - 这意味着循环导入的所有使用都在 def
块中,这些块不是从模块调用的执行水平。