在Python中的不同线程中运行类
我想用LED显示树莓PI上的状态。为此,我有一个Python程序,它将在后台使用线程运行类方法 这是我写的代码:在Python中的不同线程中运行类,python,multithreading,Python,Multithreading,我想用LED显示树莓PI上的状态。为此,我有一个Python程序,它将在后台使用线程运行类方法 这是我写的代码: #!/usr/bin/python import time import os import threading status = 0 class LEDStatus(threading.Thread): def __init__(self): threading.Thread.__init__(self) global status
#!/usr/bin/python
import time
import os
import threading
status = 0
class LEDStatus(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
global status
self.current_value = None
self.running = True
def run(self):
global status
os.system("echo gpio | sudo tee /sys/class/leds/led0/trigger")
while True:
for i in xrange(0, status):
os.system("echo 1 | sudo tee /sys/class/leds/led0/brightness")
time.sleep(0.25)
os.system("echo 0 | sudo tee /sys/class/leds/led0/brightness")
time.sleep(0.25)
time.sleep(2)
os.system("echo mmc0 | sudo tee /sys/class/leds/led0/trigger")
if __name__ == '__main__':
leds = LEDStatus()
try:
leds.status = 3
leds.start()
while True:
print "X"
time.sleep(2)
except (KeyboardInterrupt, SystemExit): #Al pulsar ctrl+c
print "\nFinish"
leds.running = False
leds.join()
当程序到达这一行os.system(“echo gpio | sudo tee/sys/class/led/led0/trigger”)
后,它不会执行run
方法中的任何操作
我做错了什么?如何从main方法更改状态变量的值?在
os.system()中运行sudo
。调用可能会被阻止。它将坐在那里等待用户输入(密码)。这取决于sudoers
文件的设置方式
您的代码还混合了全局变量和类属性。由于您分配的是self.status=3
而不是status=3
,因此status
全局变量永远不会更新
像这样使用全局变量是有点令人不快的,因为您也可以在这里真正使用class属性。将您的\uuuu init\uuuu
更改为将初始状态作为参数
def __init__(self, status):
threading.Thread.__init__(self)
self.status = status
self.current_value = None
self.running = True
在您的运行
方法中,使用self.status
:
for i in xrange(0, self.status):
...
在os.system()中运行sudo
调用可能会阻塞。它将坐在那里等待用户输入(密码)。这取决于sudoers
文件的设置方式
您的代码还混合了全局变量和类属性。由于您分配的是self.status=3
而不是status=3
,因此status
全局变量永远不会更新
像这样使用全局变量是有点令人不快的,因为您也可以在这里真正使用class属性。将您的\uuuu init\uuuu
更改为将初始状态作为参数
def __init__(self, status):
threading.Thread.__init__(self)
self.status = status
self.current_value = None
self.running = True
在您的运行
方法中,使用self.status
:
for i in xrange(0, self.status):
...
您正试图在操作系统调用中使用sudo,sudo等待输入管理员密码,但由于没有管道可从中接收密码,因此无法使用。根据sudo配置,NOPASSWD可能起作用。或者不是。这听起来确实像是sudo。如果第一个需要sudo的呼叫背后的所有东西都不是必需的,那么这不是一个简单的例子。在发布之前,请将代码缩减为1。现在,还有两件事:首先,您可以用“代码> SUDO < /Cult>调用程序,而不是试图在中间提升特权。其次,您应该能够配置对GPIO的访问权限,这样您就不需要root权限。另外,升级到Python3,它是稳定的,并且得到了很好的支持。@UlrichEckhardt OP确实提到了sudo实际上工作得很好。问题是全局变量和实例变量的混合。这种混合在“无限循环”之外是可见的,因为所述变量是在if
块中向下设置的,并且在开始时声明的全局变量…@ozat尤其不要删除说明问题的代码。我已回滚您的编辑,该编辑从这些命令中删除了sudo
。您正试图在os.system
调用中使用sudo,sudo等待输入管理员密码,但它不能,因为它没有管道接收密码。根据sudo配置,NOPASSWD可能起作用。或者不是。这听起来确实像是sudo。如果第一个需要sudo的呼叫背后的所有东西都不是必需的,那么这不是一个简单的例子。在发布之前,请将代码缩减为1。现在,还有两件事:首先,您可以用“代码> SUDO < /Cult>调用程序,而不是试图在中间提升特权。其次,您应该能够配置对GPIO的访问权限,这样您就不需要root权限。另外,升级到Python3,它是稳定的,并且得到了很好的支持。@UlrichEckhardt OP确实提到了sudo实际上工作得很好。问题是全局变量和实例变量的混合。这种混合在“无限循环”之外是可见的,因为所述变量是在if
块中向下设置的,并且在开始时声明的全局变量…@ozat尤其不要删除说明问题的代码。我已经回滚了您的编辑,从这些命令中删除了sudo
。谢谢@Ilja,我有点困惑,现在可以正常工作问题是由全局变量status
引起的谢谢@Ilja,我有点困惑,现在可以正常工作问题是由全局变量status