在python中,有log和ncurses去分开TTY

时间:2016-12-26 20:44:51

标签: python logging ncurses curses tty

我编写了一个充当服务器(tcp,kindof)的python程序,并在stdout(和文件)上记录了大量重要信息。该程序在ARM板上运行,并附有一个小的VGA显示器。

现在我想在电路板的物理显示屏上显示一些信息,同时保持对启动程序的tty的记录。

我们假设我通过SSH连接到ARM板,并在/ dev / tty3上运行该程序。

我设法使用ncurses在/ dev / tty1上显示内容(这是物理显示)。问题是,所有日志记录也都会进入pyhsical显示。

为了达到这个目的,我基本上将stodut重定向到/ dev / tty1,并在SO上找到了一些代码:

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

os.environ['TERM'] = 'linux'
logging.debug("Starting server..")

但是,当然,这会重定向所有输出。知道如何将ncurses和普通python日志记录拆分为单独的TTY吗?

2 个答案:

答案 0 :(得分:2)

好的,解决了......很简单..

1)检测当前tty

import os
import sys
tty=os.ttyname(sys.stdout.fileno())

2)设置python loggin以记录检测到的tty

import logging
logger = logging.getLogger(__package__)
logger.setLevel(log_level)

# console_handler = logging.StreamHandler()
console_handler = logging.FileHandler(tty)
console_handler.setLevel(logging.DEBUG)
logger.addHandler(console_handler)

3)欺骗stdout并错误转到所需的tty

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

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

4)导入ncurses并进行记录

import curses
stdscr = curses.initscr()
curses.noecho()

logging.debug("Tryout")

stdscr.addstr(0, 0, "Current mode: Paola mode",
          curses.A_REVERSE)
stdscr.refresh()

那就是它。 Unix的强大功能(在OSX上测试)..

答案 1 :(得分:1)

@zontar的答案似乎有点复杂。 只需登录到文件

import logging logging.basicConfig(filename='log.log', level=logging.DEBUG)

和另一个tty: tail -F log.log