启动时运行的Python诅咒程序没有键盘焦点

启动时运行的Python诅咒程序没有键盘焦点,python,python-3.x,raspberry-pi,python-curses,Python,Python 3.x,Raspberry Pi,Python Curses,我正在尝试编写一个程序,该程序将在我的raspberry pi启动时运行,并允许我立即开始用键盘输入内容,并让程序拾取它。我不想在pi启动时手动启动程序。我需要使用curses(或类似的无缓冲键盘输入库),因为我在2x16 I2C LCD上显示我正在键入的内容,但我还需要将我正在键入的所有内容记录到文本文件中 现在,我通过在rc.local中放置一行代码,在启动时自动启动程序。这是可行的,I2C显示器正确地显示了程序输出,但它不响应键盘输入,键盘输入反而显示在一个奇怪的控制台布局上(当我将饼图连

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

现在,我通过在rc.local中放置一行代码,在启动时自动启动程序。这是可行的,I2C显示器正确地显示了程序输出,但它不响应键盘输入,键盘输入反而显示在一个奇怪的控制台布局上(当我将饼图连接到屏幕时,目标是无头运行),当我按下enter键并说-bash:“我刚才键入的内容”命令未找到时,该控制台布局退出

我已经试过:

  • 在程序开始时设置计时器,以等待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 &
    
    然后是“退出0”行。
    谢谢你能提供的帮助。我知道这是一个非常具体的问题,复制起来会很乏味,但是如果有人知道任何关于自动启动功能的知识,我将非常感谢任何提示

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

    python3 journal.py &
    
    您可能希望签出bash(或shell)手册页:

    唯一前景 允许进程从。。。终点站。后台进程 试图读取。。。这个 终端发送一个信号。。。内核终端发出的信号 驱动程序,除非被捕获,否则将暂停进程

    简言之,一旦被诅咒(或任何类似的事情),尝试读取
    stdin
    ,您的进程可能会停止(在它可能已经写入您的显示器之后)。将其放在前台,以便能够使用
    stdin
    (以及通过扩展键盘)


    旁注:在您的情况下,不确定发行版和
    rc.local
    的实现细节,但是init脚本是否已经使用uid/gid 0正常运行了(没有通过
    sudo
    ?)包装单个调用)

    好的,我需要做的就是这么做(我在对stackexchange进行更多研究后发现,这条线索包含了我一直在寻找的答案)我的程序是从~/.bashrc而不是/etc/rc.local运行的。这种方法非常有效,正是我想要的。

    我将致力于研究作业控制并尝试找到解决方法。你有没有关于如何让我的python程序保持在前台而不实际键入并手动运行脚本的技巧?在你这方面,没有e、 我不知道是否需要将sudo放入init命令中,我之所以这样做是因为我认为它可能需要它才能工作,尽管我对linux的了解还不够,不知道我是否需要它。很可能我不需要。我想到的最快方法是:如果你可以在
    rc.local
    local中一直呆到你你的脚本完成了。你实际上不想让后台进程(不在当前控制台的前台)一直从键盘上获取输入,这会带来很多(安全)问题。我尝试过删除&,但当我删除时,我的pi永远不会在主显示输出上完全启动(我必须用SSH连接到它,并更改rc.local的代码以使pi再次完全启动)。它在“启动主机名服务”行之后就卡住了。“从不完全启动”我想是指
    getty
    (或类似)未启动?您是否希望系统启动
    getty
    /显示登录提示和键盘可供您的应用程序和登录提示使用?或者运行您的应用程序而不是登录提示?不幸的是,所有这些都是特定于发行版的。我可以看到更新
    rc.local
    (甚至
    rc.S
    rc.M
    )是一个选项(在我的系统上)。否则
    /etc/inittab
    也可能会引起兴趣。基于systemd的系统将再次进行不同的配置(我并不熟悉)。感谢您的帮助,我将研究这些问题。