Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ImportError:无法在导入相同名称的两个文件之间导入名称_Python_Python 3.x_Import_Python Import_Pythonpath - Fatal编程技术网

Python ImportError:无法在导入相同名称的两个文件之间导入名称

Python ImportError:无法在导入相同名称的两个文件之间导入名称,python,python-3.x,import,python-import,pythonpath,Python,Python 3.x,Import,Python Import,Pythonpath,我有这个密码 main模块 from src.comp.mypackage.wait import Wait from src.comp.mypackage.men import Men, MenItem """ Code and stuff using Men and MenItem """ if __name__ == '__main__': MenuTestDrive.main() 男人 from abc import ABCMeta, abstractmethod from

我有这个密码

main模块

from src.comp.mypackage.wait import Wait
from src.comp.mypackage.men import Men, MenItem

""" Code and stuff using Men and MenItem """

if __name__ == '__main__':
    MenuTestDrive.main()
男人

from abc import ABCMeta, abstractmethod
from src.comp.mypackage.util import NullUtil, CompUtil
util

from src.comp.mypackage.stack import Stack
from src.comp.mypackage.men import Men

""" Code and stuff using Men and MenItem """
在运行mainModule时,我会遇到以下错误:

Traceback (most recent call last):
  File "/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/mainModule.py", line 2, in <module>
    from pythonDesignPatterns.src.comp.mypackage.men import Men, MenItem
  File "/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/men.py", line 2, in <module>
    from pythonDesignPatterns.src.comp.mypackage.iterator import NullUtil, CompUtil
  File "/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/util.py", line 2, in <module>
    from pythonDesignPatterns.src.comp.mypackage.men import Men

ImportError: cannot import name 'Men'
回溯(最近一次呼叫最后一次):
文件“/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/mainModule.py”,第2行,在
从pythonDesignPatterns.src.comp.mypackage.men导入men,MenItem
文件“/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/men.py”,第2行,在
从pythonDesignPatterns.src.comp.mypackage.iterator导入NullUtil,CompUtil
文件“/home/user/PycharmProjects/pythonProj/pythonDesignPatterns/src/comp/mypackage/util.py”,第2行,在
从pythonDesignPatterns.src.comp.mypackage.men导入men
ImportError:无法导入名称“Men”
我正在使用pyCharm,但命令行中的错误是相同的

我可以提供更多的代码,但我不认为使用类有什么花哨的地方,只会分散注意力


我应该在哪里寻找失败;DR:python不允许循环导入,因此如果模块
util
从模块
men
导入,则不能让模块
men
从模块
导入

更长的回答:

您必须了解,在Python中,
导入
定义
等实际上是可执行语句,一切(或几乎)都发生在运行时。当一个模块在一个给定的过程中第一次导入时,所有顶级语句都按顺序执行,一个
模块
实例对象被创建,所有顶级名称都作为属性(注意
定义
导入
所有绑定名称)并插入到
sys.modules
cache dict中,以便下一次导入相同模块时将直接从缓存中检索它

在您的情况下,当第一次导入时,
men
模块尝试导入
util
模块,该模块不在
sys.modules
中,因此Python运行时会定位util.py(或.pyc)文件并执行它。然后它从src.comp.mypackage.men导入men到达
。此时,
men.py
尚未完全执行,因此没有
men
属性

标准解决方案是要么将循环依赖性提取到第三个模块中,要么将两个模块合并到一个模块中,具体取决于对具体情况有意义的模块(目标始终是具有低耦合和高内聚的模块)。FWIW,循环依赖性被认为是糟糕的设计,无论使用何种语言,即使该语言支持循环依赖性

有时(大多数情况下是在复杂的框架中,这些框架将某些特定的结构强加给代码和特定的导入顺序),您最终可能会得到更复杂的循环依赖链(例如a.funcX依赖于B.y,B依赖于C依赖于D依赖于E最终依赖于a.funcZ)和/或很难以合理的方式进行干净的重构。作为最后一种手段,您仍然可以推迟函数中的某些导入语句(在上面的示例中,它将位于
a.funcX
)。这仍然被认为是一种不好的做法,实际上只能作为最后的手段

作为旁注:从您的包命名方案中,我可以嗅到Java的强大影响Python不是Java并不是说Java有什么问题,只是,有了


尝试在Python中强制适应Java习语和习惯充其量只是一种痛苦和挫折的经历(在这里,这样做了…),因此我的建议是:忘记您在Java中学到的大部分东西,转而开始学习Python(不仅仅是语法——语法实际上只是一种语言的一部分,不一定是最重要的一部分)。在Python中,我们倾向于使用平面而不是嵌套,并且不尝试每个类有一个模块,您可以有一个整体(微型)框架在一个单独的模块中,如果没有实际的理由将其拆分为子模块,这是可以的。

名称
Man
真的存在于“men”包中吗?你能在你的问题中提供它的定义吗?这是一个从Java翻译过来的设计模式源代码,但一般来说,我会对类似模型的对象进行分组,并在它们出现时合并对象关于这些模式,我们什么都不做(比如Java接口),但是一些Java设计还是停留在这些模式上。无论如何,谢谢你的建议,这是一个很好的建议