我是python和RaspberryPi的新手。对于我的RaspberryPi 3,我创建了两个脚本。第一个(bash脚本)检测按下按钮并在按下按钮时执行python3脚本。
python3脚本检查一些API,将数据保存到字典然后请求输入。当输入等于数据时,执行#1操作,当不执行操作#2时。输入来自usb条形码扫描仪。 当我在RaspberryPi的桌面或cli模式下手动运行脚本时,一切都很完美。
现在我想在cli模式下启动RaspberryPi时自动启动bash脚本。我通过将脚本添加到我的rc.local文件来完成此操作。这也有效,但是当我按下按钮并且python脚本到达它要求输入的点时,我直接得到以下错误:
Traceback (most recent call last):
File "*my python script*", line 36, in <module>
scan = input()
EOFError: EOF when reading a line
我真的不知道为什么,因为当我手动运行bash脚本并且我已经搜索了类似的问题时,这不会发生,但是给定的解决方案对我不起作用或者问题没有包含某些内容喜欢我的问题。 谢谢!
以下是我的两个脚本:
bash脚本
#!/bin/bash
# Define pin as input
echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction
# Read value of pin
previous=$(cat /sys/class/gpio/gpio23/value)
# Loop
while true
do
# Read value of input
pin=$(cat /sys/class/gpio/gpio23/value)
# If input changes from 1 to 0
if [ $pin -gt $previous ]
then
# Start the script
python3 /home/pi/okey/get_api.py
else
# Sleep
sleep 2.5
fi
# Current value becomes old value for the next time
previous=$pin
done
python3脚本
# -*- coding: utf-8 -*-
import requests
import json
from nested_lookup import nested_lookup
import time
import RPi.GPIO as GPIO
from Adafruit_CharLCD import Adafruit_CharLCD
# Set pin numbers
#GPIO.setmode(GPIO.BOARD)
# Set pin 11, 12 & 13 as output
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(27, GPIO.OUT)
# Set LCD & clear
lcd = Adafruit_CharLCD(rs=26, en=19, d4=13, d5=6, d6=5, d7=11, cols=16, lines=2)
lcd.clear()
# Get API JSON data from URL
lcd.message("Abfrage der\nPaketnummern...")
api = requests.get('my api')
# Serialize data into a python dictionary
data = api.json()
# Extract tracking numbers and create python list
trackingnumbers = nested_lookup('content', data)
# Get input
GPIO.output(27, GPIO.HIGH)
lcd.clear()
lcd.message("Warten auf\nEingabe...")
scan = input()
GPIO.output(27, GPIO.LOW)
# Check if input equals a number in the list
if scan in trackingnumbers:
lcd.clear()
lcd.message("Nummer vorhanden!")
GPIO.output(18, GPIO.HIGH)
time.sleep(2.5)
GPIO.output(18, GPIO.LOW)
else:
lcd.clear()
lcd.message("Nummer nicht\nvorhanden.")
GPIO.output(17, GPIO.HIGH)
time.sleep(2.5)
GPIO.output(17, GPIO.LOW)
# Clear LCD
lcd.clear()
# Clean GPIO resources
GPIO.cleanup()