【发布时间】:2019-01-06 19:46:08
【问题描述】:
我正在尝试编写一个程序,该程序将在我的树莓派启动时运行,并允许我立即开始用我的键盘输入内容并让它被程序拾取。我不想在 pi 启动时手动启动程序。我需要使用 curses(或类似的无缓冲键盘输入库),因为我在 2x16 I2C LCD 上显示我正在输入的内容,但我还需要将我输入的所有内容记录到文本文件中。
现在,我通过在 rc.local 中添加一行来在启动时自动启动程序。这有效,I2C 显示器正确显示程序输出,但它不响应键盘输入,而是在奇怪的控制台上显示键盘输入(当我将饼图连接到屏幕时,目标是无头运行)当我按下回车键并说 -bash: 'whatever I just typed' command not found 时退出的布局。
我已经试过了:
在程序开始时设置一个计时器,等待 pi 完全启动后再初始化 curses 窗口和键盘捕获
创建一个单独的 python 程序等待 pi 完全启动,然后通过导入来运行主脚本
虽然这些方法都不起作用,但我遇到了同样的问题,但略有不同。
需要明确的是,如果我从命令行手动运行该程序,它可以完美运行。但是当我使用 rc.local 自动启动脚本时,程序没有键盘输入(或者至少没有应该输入的地方)。
我的代码:
#!/usr/bin/python
import I2C_LCD_driver, datetime, sys
from time import *
from subprocess import call
mylcd = I2C_LCD_driver.lcd()
for x in range(30): #waits for raspberry pi to boot up
mylcd.lcd_display_string("Booting Up: "+str(x), 1)
sleep(1)
import curses
key = curses.initscr()
curses.cbreak()
curses.noecho()
key.keypad(1)
key.nodelay(1)
escape=0
while escape==0:
#variable initialization
while 1:
k=key.getch()
if k>-1: #runs when you hit any key. getch() returns -1 until a key is pressed
if k==27: #exits the program when you hit Esc
break
elif k==269:
# a couple other special Function key cases are here
else:
inpt=chr(k)
mylcd.lcd_display_string(inpt,2,step) #writes the last character to the display
#some more code that handles writing the text to the LCD, which works flawlessly when run manually.
file.write("%s\r\n" % entry)
file.close()
mylcd.lcd_display_string("Saved ",2)
mylcd.lcd_display_string("F1 New F2 PwrOff",1)
while 1:
k=key.getch()
if k>-1:
if k==265: #do it again! with F1
mylcd.lcd_clear()
break
elif k==266: #shut down with F2
escape=1
break
curses.nocbreak()
key.keypad(0)
curses.echo()
curses.endwin()
call("sudo shutdown -h now", shell=True)
如果重要的话,我在 /etc/rc.local 中的行如下:
sudo python3 journal.py &
然后是“exit 0”行。 感谢您的任何帮助,您可以提供。我知道这是一个非常具体的问题,重现起来会很乏味,但如果有人知道有关自动启动功能的任何信息,我将非常感谢任何提示。
【问题讨论】:
标签: python python-3.x raspberry-pi python-curses