본문 바로가기
+ Development/Python

[Python] 개행 되지 않고 변화랑 프린트하기

by 염불법사 2018. 9. 9.
728x90
반응형

최근 개발을 하면서 지속적으로 모니터링 할 필요한 기능들이 존재 해서 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 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 do_network_stat(self, arg):

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/



728x90
반응형

댓글


loading