2016-12-26 22 views
3

我已經寫了一個python程序,充當服務器(tcp,kindof),並記錄了一大堆stdout(和文件)的重要信息。該程序在附有小VGA顯示器的ARM板上運行。在Python中,有日誌記錄和ncurses去單獨的TTY

現在我想顯示板上物理顯示的一些信息,同時在程序啓動的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?

回答

1

好了,解決了..這是相當簡單..

1)檢測當前的tty

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

2)成立蟒洛登錄到檢測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上測試)..