cmd 모듈을 사용하여 파이썬 앱을 프로토 타이핑하고 있습니다.파이썬 cmd 모듈로 페이지 매기기
사용자에게 표시되는 메시지 중 일부는 길어서 페이지 매기기를하고 싶습니다. 메시지의 처음 10 개 (또는 구성 가능한 번호) 줄이 나타나고 스페이스 바를 누르면 메시지 끝까지 다음 페이지가 표시됩니다.
여기에서 재발견하고 싶지는 않지만이 기능을 구현하는 간단한 의미가 있습니까?
cmd 모듈을 사용하여 파이썬 앱을 프로토 타이핑하고 있습니다.파이썬 cmd 모듈로 페이지 매기기
사용자에게 표시되는 메시지 중 일부는 길어서 페이지 매기기를하고 싶습니다. 메시지의 처음 10 개 (또는 구성 가능한 번호) 줄이 나타나고 스페이스 바를 누르면 메시지 끝까지 다음 페이지가 표시됩니다.
여기에서 재발견하고 싶지는 않지만이 기능을 구현하는 간단한 의미가 있습니까?
간단한 것은 런타임시 "less"또는 유사한 명령을 통해 스크립트를 파이프하는 것입니다.
여기하지만, 당신이 원하는 약 않는 간단한 방법입니다 :
def print_and_wait(some_long_message):
lines = some_long_message.split('\n')
i=0
while i < len(lines):
print '\n'.join(lines[i:i+10])
raw_input("press enter to read more...")
i += 10
또한 저주를 사용으로 볼 수 있었다.
위의 Yoni가 실행하는 올바른 방법은 실행중인 cmd 인스턴스 내에 자동으로 페이지를 인쇄하는 인쇄 메서드를 제공하는 것입니다. Cmd의 생성자는 stdin 및 stdout 인수를 사용합니다. 그래서 간단하게 stdout처럼 작동하고 페이징 인쇄 방법을 지원하는 객체를 제공하십시오.
class PagingStdOut(object):
def write(self, buffer, lines_before_pause=40):
# do magic paging here...
페이징 서브 루틴이 IPython의 genutils.py 파일에서 찾을 수있다 (간단한 하나 page
, 또는 page_dumb
참조). 이 코드는 좀 복잡하지만 Windows와 다양한 종류의 터미널 에뮬레이터를 포함한 시스템에 이식하려는 경우 불가피합니다.
감사합니다. 이미 페이징 루틴을 구현했습니다. 나는 당신이 가리키는 파일에서 내가 무엇을 놓쳤는지를 볼 것이다. 현재 내 OS에서 작동하지만 다른 것을 테스트하지 않았으므로 휴대용 향상 기능이 유용 할 수 있습니다. – Gra
나는 같은 질문을했다. pydoc module에 내장 된 호출기가 있습니다. 나는 그것을 합리적으로 통합했다. (나는 hackish하고 만족스럽지 않다. .. 나는 더 나은 아이디어에 열리다.).
나는 x 이상의 결과가 나오며 페이징이 켜져 있으면 구현할 수 있지만 여기서는 수행하지 않는 것이 좋습니다.
import cmd
from pydoc import pager
from cStringIO import StringIO
import sys
PAGER = True
class Commander(cmd.Cmd):
prompt = "> "
def do_pager(self,line):
global PAGER
line = line + " 1"
tokens = line.lower().split()
if tokens[0] in ("on","true","t", "1"):
PAGER = True
print "# setting PAGER True"
elif tokens[0] in ("off","false","f","0"):
PAGER = False
print "# setting PAGER False"
else:
print "# can't set pager: don't know -> %s" % tokens[0]
def do_demo(self,line):
results = dict(a=1,b=2,c=3)
self.format_commandline_results(results)
def format_commandline_results(self,results):
if PAGER:
ofh = StringIO()
else:
ofh = sys.stdout
for (k,v) in sorted(results.items()):
print >> ofh, "%s -> %s" % (k,v)
if PAGER:
ofh.seek(0)
pager(ofh.read())
return None
def do_EOF(self,line):
print "",
return True
if __name__ == "__main__":
Commander().cmdloop("# try: \n> pager off \n> demo \n> pager on \n> demo \n\n")
감사합니다. 그러나 less through는 cmd 모듈의 목표 인 상호 작용을 방지합니다. 저주 솔루션을 구현하는 것은 cmd 모듈로 구축하고자하는 첫 번째 초안을 훨씬 뛰어 넘습니다. 그러나 print_and_wait 솔루션은 좋은 시작입니다. – Gra