我编写了一个充当服务器(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吗?
答案 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