在Python 3.4(我的操作系统是Ubuntu/Linux 14.04)中,我有一个包含许多模块的软件包。其中一些模块相互依赖(模块 A 使用模块 B 中的对象,模块 B 使用模块 A 中的对象)。我能够通过将import Package.A
放在模块 B 的顶部和模块 A 的顶部import Package.B
来管理循环导入。 从另一个模块对类的模块内调用是通过使用类的完整包路径(例如 x = Package.A.SomeClass()
执行的。
我在以下两种情况下遇到问题:
情况 1:从模块 B 调用模块 A 中的类以定义模块 B 中的模块级变量时。
情况 2:从模块 B 调用模块 A 中的类以定义模块 B 中的类级变量时。
我想了解为什么在某些情况下Package.A.SomeClass()
有效,而在其他情况下则无效。
我在下面复制了一个非常简化的代码版本(我的真实代码可以包含来自 3 或 4 个模块的依赖项)。
我的软件包结构:
/home/phodor/test.py
/home/phodor/MInventory
/home/phodor/MInventory/__init__.py (empty file)
/home/phodor/MInventory/MProducts.py
/home/phodor/MInventory/MStores.py
一般情况:以下效果很好
/home/phodor/minventory/MProducts.py
import MInventory.MStores
class MRobot():
def __init__(self):
self.Price = 0
self.Weight = 0
/home/phodor/minventory/MStores.py
import MInventory.MProducts
class MCommercialCenterStore():
def __init__(self):
self.Name = ""
self.CommercialCenter = ""
self.Products = []
self.MostSoldProduct = MInventory.MProducts.MRobot()
/home/phodor/test.py
import sys
sys.path.append("/home/phodor/")
from MInventory.MProducts import *
from MInventory.MStores import *
oStore = MCommercialCenterStore()
oStore.Name = "Main Street SuperCenter"
print(oStore.Name)
print(oStore.MostSoldProduct)
情况 1:以下情况会产生错误。
/home/phodor/minventory/MStores.py
import MInventory.MProducts
CustomersChoice = MInventory.MProducts.MRobot
class MCommercialCenterStore():
def __init__(self):
self.Name = ""
self.CommercialCenter = ""
self.Products = []
self.MostSoldProduct = CustomersChoice
错误:
CustomersChoice = MInventory.MProducts.MRobot
AttributeError: 'module' object has no attribute 'MProducts'
情况 2:以下还会产生错误。
/home/phodor/minventory/MStores.py
class MCommercialCenterStore():
MostSoldProduct = MInventory.MProducts.MRobot
def __init__(self):
self.Name = ""
self.CommercialCenter = ""
self.Products = []
错误:
MostSoldProduct = MInventory.MProducts.MRobot
AttributeError: 'module' object has no attribute 'MProducts'
循环依赖关系信息
如前所述,我的包包含循环依赖项。到目前为止,解决此问题的唯一方法是在我的包模块的开头使用以下语句:
import MInventory.Mproducts ----> in the MStores module
import MInventory.MStores ----> in the MProducts module
由于循环依赖项,使用以下语句会导致错误:
from MInventory import MProducts
from MInventory import MStores
ImportError: cannot import name 'MProducts'
知道为什么MInventory.MProducts.MRobot
可以在一般情况下正确调用,以及为什么它在作为模块级变量或类级变量调用时不起作用?
我认为错误在于python在模块名称和要使用的函数或类的名称之间没有区别!
这个问题非常频繁,但它可以以许多不同的形式出现。在这里,您尝试进入一个名为 MInventory
.此文件不存在,因此也没有模块。这就产生了问题。
也可能是您必须以另一种方式导入模块。尝试:
from MInventory import *
或
from MInventory import (MProducts, MStores)
我尝试了其他代码示例,并且效果很好。如果它不起作用,我也不知道它可能是什么。
真诚的,赫里卡