2009-02-06 4 views
8

cmd 모듈을 사용하여 파이썬 앱을 프로토 타이핑하고 있습니다.파이썬 cmd 모듈로 페이지 매기기

사용자에게 표시되는 메시지 중 일부는 길어서 페이지 매기기를하고 싶습니다. 메시지의 처음 10 개 (또는 구성 가능한 번호) 줄이 나타나고 스페이스 바를 누르면 메시지 끝까지 다음 페이지가 표시됩니다.

여기에서 재발견하고 싶지는 않지만이 기능을 구현하는 간단한 의미가 있습니까?

답변

4

간단한 것은 런타임시 "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 

또한 저주를 사용으로 볼 수 있었다.

+0

감사합니다. 그러나 less through는 cmd 모듈의 목표 인 상호 작용을 방지합니다. 저주 솔루션을 구현하는 것은 cmd 모듈로 구축하고자하는 첫 번째 초안을 훨씬 뛰어 넘습니다. 그러나 print_and_wait 솔루션은 좋은 시작입니다. – Gra

3

위의 Yoni가 실행하는 올바른 방법은 실행중인 cmd 인스턴스 내에 자동으로 페이지를 인쇄하는 인쇄 메서드를 제공하는 것입니다. Cmd의 생성자는 stdin 및 stdout 인수를 사용합니다. 그래서 간단하게 stdout처럼 작동하고 페이징 인쇄 방법을 지원하는 객체를 제공하십시오.

class PagingStdOut(object): 
    def write(self, buffer, lines_before_pause=40): 
     # do magic paging here... 
0

페이징 서브 루틴이 IPythongenutils.py 파일에서 찾을 수있다 (간단한 하나 page, 또는 page_dumb 참조). 이 코드는 좀 복잡하지만 Windows와 다양한 종류의 터미널 에뮬레이터를 포함한 시스템에 이식하려는 경우 불가피합니다.

+0

감사합니다. 이미 페이징 루틴을 구현했습니다. 나는 당신이 가리키는 파일에서 내가 무엇을 놓쳤는지를 볼 것이다. 현재 내 OS에서 작동하지만 다른 것을 테스트하지 않았으므로 휴대용 향상 기능이 유용 할 수 있습니다. – Gra

1

나는 같은 질문을했다. 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")