我遇到了循环导入问题。我有三个Python测试模块:robot_test.py,它是我的主脚本,然后是两个辅助模块,controller_test.py和servo_test.py。我的想法是,我希望controller_test.py为我的微控制器定义一个类,为servo_test.py定义一个类来定义我的舵机。然后我想在robot_test.py中实例化这些类。这里是我的三个测试模块:如何避免在Python中导入循环?
""" robot_test.py """
from pi.nodes.actuators.servo_test import Servo
from pi.nodes.controllers.controller_test import Controller
myController = Controller()
myServo = Servo()
print myController.ID, myServo.ID
""" controller_test.py """
class Controller():
def __init__(self, id="controller"):
self.ID = id
""" servo_test.py """
class Servo():
def __init__(self, id="servo"):
self.ID = id
如果我跑robot_test.py,我得到预期的打印输出:
控制器伺服
然而,现在来的扭曲。实际上,servo_test.py模块通过robot_test.py的方式依赖于controller_test.py。这是因为我的伺服定义在它们自己被实例化之前需要一个已经实例化的控制器对象。但我想保留robot_test.py中的所有初始实例。所以,我想修改我servo_test.py脚本如下:
""" servo_test.py """
from pi.nodes.robots.robot_test import myController
class Servo():
def __init__(self, id="servo"):
self.ID = id
print myController.ID
当然,我能感觉到圆是要引起问题果然,当我现在尝试运行robot_test.py我得到的错误:
导入错误:无法导入名称伺服
这又是servo_test.py返回错误引起的:
导入错误:无法导入名myController的
在C#中我将myController和myServo定义为robot_test.py中的静态对象,然后我可以在其他类中使用它们。无论如何,在Python中做同样的事情吗?我找到的一种解决方法是将myController对象作为参数传递给Servo类,但我希望避免必须这样做。
谢谢!
你不喜欢将控制对象作为参数传递给你? – MattH 2010-06-30 14:18:27
我很高兴使用这个解决方案,如果它是唯一可用的,但我想尽可能地扩展我对Python的理解,所以想知道是否有其他方法来做到这一点。 – RPG 2010-06-30 14:27:22
首先,搜索SO作为“循环导入”。 http://stackoverflow.com/search?q=python+circular+import其次,阅读这些问题,看看其中哪些与您的相同。 – 2010-06-30 15:26:05