在Python中调用嵌套模块

时间:2018-06-28 12:18:21

标签: python python-2.7

我最近一直在研究一个包含150多个文件的项目,并且在切换模块方面面临着很大的障碍。

我具有允许切换模块的功能。它以下面的方式工作(我给出一个简化的解释):

假设有四个文件,分别为tf.contribfirst.pysecond.pythird.py,并且以下每个文件都有一个与文件名相同的模块,该文件名调用其先前的功能如下。

fourth.py

的内容
first.py

from second import * def first(): second()

的内容
second.py

from third import * def second(): third() 的内容:

third.py

from fourth import * def third(): q = raw_input('Use (f)ourth or go (b)ack?') if q == 'f': fourth() # proceed to fourth elif q == 'b': second() # back to second module # this is how the switching of modules work 的内容:

fourth.py

现在,当调用def fourth(): <stuff1> 时,解释器将请求first()。如果f or b,则执行f,但是当输入<stuff1>时,它会给b这样的内容。

NameError

这基本上就是模块切换失败的原因。我尝试通过添加Traceback (most recent call last): File "first.py", line 4, in <module> first() File "first.py", line 3, in first second() File "test/second.py", line 3, in second third() File "test/third.py", line 7, in third second() NameError: global name 'second' is not defined 来导入第三文件中的second.py,这无济于事,而是将ImportError用作from second import second。将ImportError: cannot import name second声明为function names也没有帮助。

有什么办法可以实现这一目标。或者有一种更有效的方法来解决切换问题。

编辑: 我知道正在创建循环依赖关系,但是还有其他方法可以在不创建此循环依赖关系的情况下启动和运行这四个模块。

1 个答案:

答案 0 :(得分:2)

在我看来,这是循环导入。 问题出在 second.py third.py 之间。您在 second.py 中调用 third ,然后在 third.py 中调用 second 。 您可以阅读this article来了解什么是循环进口以及如何防止它们。

P.S。我建议不要使用此语法从其他模块导入内容。

from ... import * 

这可能会导致名称冲突,并且您不知道此模块内部的内容。 更好的选择是只导入您需要的东西或引用模块的特定功能。