我对使用C#多年的Python相对较新,我希望有人可以帮我解决这个问题。我有一个名为actuator.py的模块,它包含许多类,用于定义我在机器人项目中使用的伺服器的属性和方法。在另一个名为robot.py的模块中,我像这样实例化我的执行器:
import actuators as Actuators
myActuators = Actuators.AllActuators()
只要我在robot.py模块中,这允许我访问我的伺服器的属性。例如,我可以写:
print myActuators.HeadTilt.MinPosition
获得允许倾斜机器人头部的伺服的最小值。到目前为止一切都很好。
现在我想在一个由名为tilt_head.py的不同模块定义的单独线程中访问这些相同的值。我假设我需要导入对robot.py模块的引用,但这样做最终会重新执行robot.py中的所有代码,而我真正想要的只是对myActuators对象的静态引用。我无法使用
from robot.py import myActuators
因为myActuators不是模块。
在C#中,我会使用这样的声明:
public static Actuators myActuators;
然后允许我在项目中的任何其他文件中引用myActuators。有没有办法在Python中做类似的事情?如果您需要我的实际代码,我将很乐意发布它。
谢谢!
答案 0 :(得分:2)
我无法使用
from robot.py import myActuators
因为myActuators不是模块。
但是myActuators
不需要是一个模块。你可以做到这一点。 (虽然您只想使用robot
而不是robot.py
)
http://docs.python.org/reference/simple_stmts.html#import
同样:
http://docs.python.org/tutorial/modules.html#more-on-modules
“模块可以包含可执行语句以及函数定义。这些语句用于初始化模块。它们仅在模块第一次导入某个地方时执行。”
因此,使用导入robot
然后tilt_head
的脚本,robot.py
中的可执行内容将不会多次运行。
当然,如果robot.py
打算成为该计划的主要模块,那么我建议选择A. Levy的答案。
答案 1 :(得分:1)
你应该可以简单地使用:
from robot import myActuators
您不能说“来自robot.py”,因为名称中有一个模块名称,而不是文件名。
顺便说一句:我不确定你为什么这么做import actuators as Actuators
。你为什么要改变这个案子?模块通常是小写的。
答案 2 :(得分:1)
正如其他人所说,你实际上可以从机器人模块导入myActuators。为了解决重新执行机器人代码的问题,标准的Python方法是将独立代码包装在if __name__ == '__main__':
中,这样只有在模块用作独立应用程序时才会执行,但不是在导入时。
E.G。
# Things that are defined when robot.py is used as a module
# and when used standalone.
import actuators as Actuators
myActuators = Actuators.AllActuators()
if __name__ == '__main__':
# Stuff that you only want executed when running robot.py
然后,当你想在另一个模块中使用robot.py时,你应该可以这样做:
from robot import myActuators
实际上,正如JAB指出的那样,我对条件执行的解释有点困惑。如果重新加载模块,则不会重新执行代码。模块加载机器处理模块的重新加载,以确保它们只被加载和定义一次。所有后续加载都是对先前加载的模块的引用。但是,如果您确实只有在将模块作为脚本运行时才会执行某些步骤,则可以将它们放在if块中,并且在从其他模块加载机械手时不会执行这些步骤。
我想它并没有真正解决你的问题,虽然看起来你的问题确实是一个错误的导入语法。
答案 3 :(得分:0)
我猜你可以将该对象作为robot.myActuators访问,因为它已经存在于robot.py命名空间内的进程中。
答案 4 :(得分:0)
非常感谢所有的答案和指示。事实证明,我的问题是递归导入,最终尝试不止一次创建一个对象。通过逻辑上整理实例创建,我终于能够解决问题。