2015-05-18 135 views
1

我使用Python的第一次,並且遇到了以下問題,在運行它在樹莓派版B +修訂版2:錯誤的文件描述符錯誤(錯誤9)樹莓

的代碼應該設置引腳22(BCM)中斷,當按下按鈕,停止OS:

# Import the modules to send commands to the system and access GPIO pins 
from subprocess import call 
import RPi.GPIO as gpio 

# Define a function to keep script running 
def loop(): 
    raw_input() 


# Define a function to run when an interrupt is called 
def shutdown(pin): 
    call('halt', shell=False) 

gpio.setmode(gpio.BCM) # Set pin numbering to BCM numbering 
gpio.setup(22, gpio.IN) # Set up pin 22 as an input 
gpio.add_event_detect(22, gpio.RISING, callback=shutdown, bouncetime=200) # Set up an interrupt to look for button presses 


loop() # Run the loop function to keep script running 

程序運行正常,當我這樣稱呼它:

python program.py 

但如果我把它放在t中他的背景是這樣的:

python program.py & 

它工作得很好,直到我做任何另一個命令(可以是任何東西(例如。 LS))。 然後停止(但不殺死它)。

我做了一個nohup的輸出,這就是我在這:

Traceback (most recent call last): 
    File "haltButton.py", line 19, in <module> 
    loop() # Run the loop function to keep script running 
    File "haltButton.py", line 7, in loop 
    raw_input() 
IOError: [Errno 9] Bad file descriptor 

可有人請點我朝着正確的方向?

回答

3

後臺程序不能做raw_input()。這就是後臺程序的重點:放棄用戶輸入,以便shell(或其他程序)可以運行並處理它。

如果你只是想一直運行直到發出信號,只需找到一個不同的方式來做到這一點。幾乎什麼將工作,除了raw_input。例如,您可以在某些fd上循環使用time.sleepselect.select,或者您可以考慮的其他任何內容,除非嘗試從您關閉的fd讀取。

+0

哦,我現在明白了,謝謝! 雖然另一個問題: time.sleep使用while循環對嗎?那麼它就會打破中斷的全部目的,而不是經常檢查GPIO引腳的while循環。 –

+1

@WilhelmSorban:'time.sleep'不能在while循環中工作,它通過讓內核在接下來的1秒內(或者很長時間)不運行你的程序來工作,除非有信號。 – abarnert

+1

@WilhelmSorban:在封面上,這與'raw_input'沒什麼區別,它在標準輸入中包含一個阻塞的'read'調用,它告訴內核不要運行你的程序,直到需要讀取文件描述符除非有信號。 – abarnert

相關問題