2016-12-26 11 views
3

나는 서버 (tcp, kindof) 역할을하는 python 프로그램을 작성하고 stdout (및 파일)에 중요한 정보를 기록합니다. 이 프로그램은 작은 VGA 디스패치가 연결된 ARM 보드에서 실행됩니다.파이썬에서 로깅 및 ncurses 별도 TTY로 이동

이제 프로그램이 시작된 tty에 대한 로깅을 유지하면서 보드의 실제 디스플레이에 대한 정보를 표시하려고합니다.

우리는 SSH를 통해 ARM 보드에 연결하고/dev/tty3에서 프로그램을 실행한다고 가정 해 보겠습니다.

나는 물리적 인 디스플레이 인/dev/tty1에 물건을 표시하기 위해 ncurses를 사용할 수있었습니다. 문제는 모든 로깅이 pyhsical 디스플레이에도 적용된다는 것입니다.

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..") 

그러나 이것은 물론, 모든 출력을 리디렉션

내가 기본적으로 SO에서 발견 코드의 일부 조각은/dev/tty1로에 stodut를 리디렉션 한이를 달성합니다. ncurses와 일반 Python 로깅을 분리하여 TTY를 분리하는 방법에 대한 아이디어가 있습니까?

답변

1

확인 해결할 .. 꽤 간단 ..

1) 파이썬 loggin에 설정

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 기록 전류 TTY 검출) 트릭 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() 

를 기록 않습니다. 유닉스의 힘 (OSX에서 테스트 됨) ..