我试图在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
答案 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)