최근 개발을 하면서 지속적으로 모니터링 할 필요한 기능들이 존재 해서 Python 으로 만들어 보기로 했다.
그러다 알게된 curses 를 간단히 정리 해본다.
1. 첫번째 텍스트 한줄만 지속적으로 업데이트 해보기
print 구문에 \r 로 시작하고 기본으로 개행이 포함된 출력을 하기 때문에 end 옵션에 "" 을 추가하여 프린트 하면 개행 되지 않고 한줄에서 계속 업데이트 된 텍스트를 볼 수 있다.
Code )
for i in range(0, 100):
print("\r {0}".format(i), end="")
time.sleep(0.5)
Play )
2. 멀티라인 형태로 출력하기
멀티 라인 형태로 구현할때 curses 를 이용하여 구현이 가능 하다.
curses 는 원래 c 언어로 만들어진 내용이 있었다.
예전 회사에서 command 모드에서 활용했던 기억이 있다.
잊고 있었는데 필요해서 찾아보니 해당 라이브러리도 system 관리 프로그램을 하루만에 만들수 있었다. ( c언어로 했을때는 몇달이 걸렸던거 같은데;; )
마침또 psutil example 에도 활용한 내용이 있어서 cmd 와 curses 라이브러리를 이용해서 command 명령어로 다양한 모니터링을 할 수 있게 만들어 보았다.
코드는 추후에 공개 할 예정..
def do_network_stat(self, arg):def tear_down():
win.keypad(0)
curses.nocbreak()
curses.echo()
curses.endwin()
def print_line(line, highlight=False):
"""A thin wrapper around curses's addstr()."""
global lineno
try:
if highlight:
line += " " * (win.getmaxyx()[1] - len(line))
win.addstr(lineno, 0, line, curses.A_REVERSE)
else:
line += " " * (win.getmaxyx()[1] - len(line))
win.addstr(lineno, 0, line, 0)
except curses.error as e:
lineno = 0
win.refresh()
raise
else:
lineno += 1
win = curses.initscr()
atexit.register(tear_down)
curses.endwin()
def poll(interval):
"""Retrieve raw stats within an interval window."""
tot_before = psutil.net_io_counters()
pnic_before = psutil.net_io_counters(pernic=True)
# sleep some time
time.sleep(interval)
tot_after = psutil.net_io_counters()
pnic_after = psutil.net_io_counters(pernic=True)
return (tot_before, tot_after, pnic_before, pnic_after)
def refresh_window(tot_before, tot_after, pnic_before, pnic_after):
global lineno
# totals
print_line("total bytes: sent: %-10s received: %s" % (
convert_size(tot_after.bytes_sent),
convert_size(tot_after.bytes_recv))
)
print_line("total packets: sent: %-10s received: %s" % (
tot_after.packets_sent, tot_after.packets_recv))
# per-network interface details: let's sort network interfaces so
# that the ones which generated more traffic are shown first
print_line("")
nic_names = list(pnic_after.keys())
nic_names.sort(key=lambda x: sum(pnic_after[x]), reverse=True)
for name in nic_names:
stats_before = pnic_before[name]
stats_after = pnic_after[name]
templ = "%-15s %15s %15s"
print_line(templ % (name, "TOTAL", "PER-SEC"), highlight=True)
print_line(templ % (
"bytes-sent",
convert_size(stats_after.bytes_sent),
convert_size(
stats_after.bytes_sent - stats_before.bytes_sent) + '/s',
))
print_line(templ % (
"bytes-recv",
convert_size(stats_after.bytes_recv),
convert_size(
stats_after.bytes_recv - stats_before.bytes_recv) + '/s',
))
print_line(templ % (
"pkts-sent",
stats_after.packets_sent,
stats_after.packets_sent - stats_before.packets_sent,
))
print_line(templ % (
"pkts-recv",
stats_after.packets_recv,
stats_after.packets_recv - stats_before.packets_recv,
))
print_line("")
win.refresh()
lineno = 0
currnet_data =0
win.clear()
while True:
try:
args = poll(currnet_data)
refresh_window(*args)
currnet_data = 1
except (KeyboardInterrupt, SystemExit):
win.refresh()
break
except Exception as e:
win.refresh()
break
curses.endwin()
Play )
* 참고 코드 및 문서
https://github.com/giampaolo/psutil
https://docs.python.org/3/howto/curses.html
https://docs.python.org/3/library/cmd.html?highlight=cmd#module-cmd
https://psutil.readthedocs.io/en/latest/
'+ Development > Python' 카테고리의 다른 글
[Python] 연산자 정리 (0) | 2018.09.23 |
---|---|
[Python] 자료형 확인 (0) | 2018.09.23 |
[Python] 변수명(함수명, 클래스명등) 만드는 법 (0) | 2018.09.23 |
[Python] MySQL-Python 설치 (0) | 2018.09.23 |
[Python] Virtualenv 설치 및 사용법 (0) | 2018.09.22 |
댓글