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
可有人請點我朝着正確的方向?
哦,我現在明白了,謝謝! 雖然另一個問題: time.sleep使用while循環對嗎?那麼它就會打破中斷的全部目的,而不是經常檢查GPIO引腳的while循環。 –
@WilhelmSorban:'time.sleep'不能在while循環中工作,它通過讓內核在接下來的1秒內(或者很長時間)不運行你的程序來工作,除非有信號。 – abarnert
@WilhelmSorban:在封面上,這與'raw_input'沒什麼區別,它在標準輸入中包含一個阻塞的'read'調用,它告訴內核不要運行你的程序,直到需要讀取文件描述符除非有信號。 – abarnert