简体   繁体   中英

python loop(): raw_input() EOFError: EOF when reading a line

Here is script (/shutdown.py). It monitors button press and if button is pressed more than 3 seconds, it runs poweroff command.

#!/usr/bin/python

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

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

# Define a function to run when an interrupt is called
def shutdown(pin):
    button_press_timer = 0
    while True:
        if (gpio.input(17) == False) : # while button is still pressed down
            button_press_timer += 1 # keep counting until button is released
            if button_press_timer == 3:
                #print "powering off"
                call('poweroff', shell=True)
            sleep(1)
        else: # button is released, figure out for how long
            #print "Poga atlaista. nospiesta bija " + str(button_press_timer) + " sekundes"
            #button_press_timer = 0
            return
#       sleep(1) # 1 sec delay so we can count seconds
#    print "powering off"

gpio.setmode(gpio.BCM) # Use BCM GPIO numbers
gpio.setup(17, gpio.IN, pull_up_down=gpio.PUD_UP) # Set up GPIO 17 as an input
gpio.add_event_detect(17, gpio.FALLING, callback=shutdown, bouncetime=200) # Set up an interrupt to look for button presses

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

If I run script from console like /shutdown.py all is fine. Button press is detected and system shutdown is initialed. But if i add that script to /etc/rc.local (/shutdown.py &), then it fails at startup with this error:

Traceback (most recent call last):
  File "/shutdown.py", line 35, in <module>
    loop() # Run the loop function to keep script running
  File "/shutdown.py", line 11, in loop
    raw_input()
EOFError: EOF when reading a line

If I comment out loop() line, then there is no error and script does not run in background. I just start and exit and button press not detected. So, how i can run that script at startup and keep running in background?

EDIT

I am not python guru and i think that loop() is python internal function. Now i seen that it is defined function which calls raw_input() . That script I found and modified to fit my needs. Thanks.

What you really need is a Python daemon which runs in the background. The raw_input method you are trying to use looks like an ugly hack to me.

Have a look at python-daemon package, which is meant exactly for your use case and is quite simple to use. There is also an updated fork with Python 3 support.

After installing python-daemon, add this line to the beginning of your script

import daemon

Then substitute the loop() call at the end of your script with this code:

with daemon.DaemonContext():
    while True:
        time.sleep(10)

This code is untested, but you get the idea.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM