我想使用LED显示Raspberry 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
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/leds/led0/trigger")
后,它不会执行run
方法中的任何内容。
我做错了什么?如何从main方法更改状态变量的值?
答案 0 :(得分:4)
在sudo
通话中运行os.system()
可能会阻止。它会坐在那里等待用户输入(密码)。这取决于sudoers
文件的设置方式。
您的代码还混合了全局变量和类属性。 status
全局变量永远不会更新,因为您指定了self.status = 3
而不是status = 3
。
使用像这样的全局变量有点不受欢迎,因为你可能真的在这里使用了class属性。更改您的__init__
以将初始状态作为参数。
def __init__(self, status):
threading.Thread.__init__(self)
self.status = status
self.current_value = None
self.running = True
并在run
方法中使用self.status
:
for i in xrange(0, self.status):
...