我已经编写了一个充当服务器(tcp,kindof)的python程序,并在stdout(和文件)上记录了大量重要信息.该程序在ARM板上运行,并附有少量VGA显示.
现在,我想在板子的物理显示屏上显示一些信息,同时保持启动程序所在的tty的日志记录.
假设我通过SSH连接到ARM板,然后在/ dev / tty3上运行该程序.
我设法使用ncurses在/ dev / tty1(这是物理显示)上显示内容.问题是,所有日志记录也都将显示在物理显示器上.
为了实现这一点,我基本上使用在SO上找到的一些代码将stodut重定向到/ dev / tty1:
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的任何想法?
解决方法:
好,解决了..这很简单..
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和err去想要的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上测试).