2016-03-15 87 views
0

我想使用LED在Raspberry PI上顯示狀態。要做到這一點,我有一個Python程序,將使用線程在後臺運行類方法。在Python中運行不同的線程

這是我寫的代碼:該程序涉及到這一行os.system("echo gpio | sudo tee /sys/class/leds/led0/trigger")

#!/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() 

後,不執行在run方法什麼。

我在做什麼錯?我怎樣才能從主方法中更改狀態變量的值?

+0

您試圖在'os.system'呼叫使用sudo,須藤等待管理員密碼輸入,但它可以」因爲它沒有管道來接收它。 –

+0

取決於sudo配置,NOPASSWD可能正在發揮作用。或不。它聽起來像是sudo。 –

+0

我不認爲這是問題,我已經在一個主線程中測試過這些行,它工作正常 – ozat

回答

4

運行sudoos.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

問題是由全局變量'狀態' – ozat