繁体   English   中英

将 curses 应用程序的输出发送到 tty1

[英]Sending curses application's output to tty1

目标

我想让我的 curses Python 应用程序在 Linux 机器的第一个物理控制台 (TTY1) 上显示其输出,方法是将其添加到/etc/inittab ,使用telinit q重新加载 init 等等。

当从/etc/inittab启动它时,我想避免使用 IO 重定向的hacky 方式:

1:2345:respawn:/path/to/app.py > /dev/tty1 < /dev/tty1

我所追求的是在我的应用程序中以本机方式执行此操作,类似于getty执行此操作的方式,即您使用命令行参数来告诉它在哪个 TTY 上收听:

S0:2345:respawn:/sbin/getty -L ttyS1 115200 vt100

示例代码

为简单起见,假设我编写了这个非常复杂的应用程序,在调用时使用 ncurses 例程打印一些内容。

import curses

class CursesApp(object):

  def __init__(self, stdscr):
    self.stdscr = stdscr
    # Code producing some output, accepting user input, etc.
    # ...    

curses.wrapper(CursesApp)

我已经拥有的代码做了我需要的一切,除了它只在运行它的终端上显示它的输出。 在没有我上面提到的 hacky 重定向的情况下从 inittab 调用时,它可以工作,但在 TTY1 上没有输出。

我知道 init 不会自己重定向输入和输出,所以这是意料之中的。

我需要如何修改现有代码以将其输出发送到请求的 TTY 而不是 STDOUT?

附注。 我不是在问如何添加对命令行参数的支持,我已经有了这个,但为了简洁起见从代码示例中删除了它。

这比较简单。 只需打开终端设备一次输入,一次输出; 然后将输入描述符复制到活动进程的文件描述符 0,并将输出描述符复制到文件描述符 1 和 2。然后关闭 TTY 的其他句柄:

import os
import sys

with open('/dev/tty6', 'rb') as inf, open('/dev/tty6', 'wb') as outf:
    os.dup2(inf.fileno(), 0)
    os.dup2(outf.fileno(), 1)
    os.dup2(outf.fileno(), 2)

我用在 TTY6 上运行的cmd模块对此进行了测试:

import cmd
cmd.Cmd().cmdloop()

完美运行。 使用诅咒,从它们的外观中可以明显看出缺少某些东西: TERM环境变量:

os.environ['TERM'] = 'linux'

在导入curses之前执行所有这些语句,它应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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