在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

我想用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
        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