2016-03-15 3 views
0

Я хочу показать статус на малине PI, используя светодиод. Для этого у меня есть программа на Python, которая будет запускать методы класса в фоновом режиме с помощью потоков.Run class in different Thread in 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 не выполняется.

Что я делаю неправильно? Как изменить значение переменной статуса из основного метода?

+0

Вы пытаетесь использовать Sudo в 'os.system' вызова Судо ждет пароль администратора, который необходимо ввести, но это может» t, так как у него нет трубки для его получения. –

+0

Зависит от конфигурации sudo, NOPASSWD может играть. Или нет. Звучит так, как будто это правда. –

+0

Я не думаю, что это проблема, я протестировал эти строки в основном потоке, и он отлично работает – ozat

ответ

4

Запуск sudo в os.system() звонок может блокироваться. Он будет сидеть там, ожидая ввода пользователя (пароль). Это зависит от того, как был создан файл sudoers.

Ваш код также смешивает глобальные переменные и атрибуты класса. Глобальная переменная status никогда не обновляется, поскольку вы назначаете self.status = 3 вместо status = 3.

Использование глобальных переменных, подобных этому, немного нахмурилось, так как вы действительно можете использовать атрибут класса здесь. Измените свой __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): 
    ... 
+0

Спасибо @Ilja, я был немного смущен, теперь он отлично работает – ozat

+0

Проблема была вызвана глобальными переменная 'status' – ozat