我第一次使用Python,遇到以下问题,在Raspberry Pi版本B + rev 2上运行它:
代码应该在引脚22(BCM)上设置中断,当按下按钮时,停止操作系统:
# 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
但如果我把它放在背景中这样:
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
有人可以指出我正确的方向吗?
答案 0 :(得分:3)
后台程序无法执行raw_input()
。这就是后台程序的重点:放弃用户输入,以便shell(或其他程序)可以运行并处理它。
如果您只是希望在发出信号之前永远运行,只需找到一种不同的方式。几乎任何都可以使用,raw_input
除外。例如,您可以在某些fd或其他任何您能想到的内容上循环time.sleep
或select.select
,除非您尝试从已关闭的fd中进行读取。