RPi-引导时运行的Python Curses程序没有键盘焦点

时间:2019-01-06 19:46:09

标签: python python-3.x raspberry-pi python-curses

我正在尝试编写一个程序,该程序将在我的树莓派启动时运行,并允许我立即开始使用键盘输入内容并由程序拾取。我不想在pi启动时手动启动程序。我需要使用curses(或类似的无缓冲键盘输入库),因为我会在2x16 I2C LCD上显示正在输入的内容,但是我还需要将输入的所有内容都记录到文本文件中。

现在,我通过在rc.local中添加一行来在启动时自动启动程序。这可以正常工作,并且I2C显示器正确显示了程序输出,但是它不响应键盘输入,而是在奇数游戏机上显示了键盘输入(当我将派连接到屏幕时,目标是无头运行)。当我按Enter并说-bash时退出的布局:找不到“无论我键入什么”命令。

我已经尝试过:

  1. 在程序开始时设置一个计时器,等待pi完全启动后再初始化curses窗口和键盘捕获

  2. 创建一个单独的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 &

,其后是“退出0”行。 感谢您的任何帮助,您可以提供。我知道这是一个非常具体的问题,将很繁琐,但是如果有人对自动启动功能有所了解,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

好吧,实际上,我要做的所有事情(我在对stackexchange进行了更多研究之后才发现,this是包含我所寻找答案的线程)是从〜/ .bashrc运行程序的/etc/rc.local。这种方法完美地工作,正是我想要的。

答案 1 :(得分:0)

这应该是因为您如何调用程序:

python3 journal.py &

您可能想查看bash(或您的shell)手册页中的JOB CONTROL

  

仅前景          允许从终端读取进程。后台流程          尝试从...读取          终端通过内核终端发送SIGTTIN ...信号          驱动程序,除非被捕获,否则将挂起该进程。

简而言之,一旦诅咒(或与此有关的任何事情)尝试从stdin中读取,您的过程可能会停止(在它可能已经写入显示器之后)。将其放在最前面可以使用stdin(并通过扩展键盘)。

旁注:不确定您所使用的rc.local的发行版和详细信息,但是init脚本通常不是已经使用uid / gid 0运行了(没有通过sudo包装单个调用吗? )