在Python中的不同Thread中运行类

时间:2016-03-15 06:39:47

标签: python multithreading

我想使用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方法更改状态变量的值?

1 个答案:

答案 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):
    ...
相关问题