循环功能导入

时间:2014-11-07 13:05:54

标签: python python-2.6

我试图在python 2.6中执行以下操作。

my_module.py:-
    from another_module import another_factory

    def my_factory(name):
        pass

another_module.py:-
    from my_module import my_factory

    def another_factory(name):
        pass

两个模块位于同一文件夹中。

它给了我错误:

Error: cannot import name my_factory

2 个答案:

答案 0 :(得分:2)

从评论中可以看出,您正在尝试进行循环导入,这是不可能的。

如果在你的模块A中你试图从模块B导入一些东西,并且在加载模块B时(为了满足这种依赖性),你试图从模块A导入一些东西,你就是你开始的地方,你得到了一个圈子导入:需要B和B需要A !!,它有点像说A需要A,这是非常不逻辑的。

例如:

# moduleA
from moduleB import functionB
...

因此解释器尝试加载moduleB,如下所示:

# moduleB
from moduleA import functionA
...

然后回到moduleA,它再次尝试导入B,等等。因此python只会引发错误并停止精神错乱以获得更大的利益。

依赖关系不会像这样工作。定义哪个模块需要另一个模块,只需进行简单的导入即可。在您的示例中,似乎another_module需要my_module,因此请更改my_module并消除对another_module的依赖。

如果两个模块实际上彼此需要,则清楚地表明它们属于相同的逻辑概念,并且应该合并。

PD:在某些情况下为了避免使用大文件,你可以将逻辑单元拆分为两个,并且为了避免循环依赖,你在函数内部编写导入(在加载时不执行),这样就可以了不是一个圆圈。然而,这通常是需要避免的。

答案 1 :(得分:0)

真正的问题是......您认为每个文件都是模块还是的一部分?

尝试在之外导入模块有时会很痛苦。您只需在目录中创建一个空的 __ init __。py 模块来构建一个包。但是,如果你有

__init__.py
my_module.py
another_module.py

如果您在 my_module.py 中有以下功能,

def my_factory(x):
    return x * x

您应该能够通过写下 another_module.py 来访问 my_factory()函数:

from my_module import my_factory

但是,如果您没有 __ init __。py 文件/模块,导入功能将(以某种方式)丢失并仅使用 sys.path 用于搜索其他模块。然后,您可以在 another_module.py 文件中添加以下行( import 之前):

sys.path.append(os.path.dirname(os.path.expanduser('.')))

您还可以使用各种可用的软件包来帮助导入模块,例如 imp import_file (请参阅文档)。或者您可以决定使用 load_source (另请参阅文档:https://docs.python.org/2/library/imp.html