복붙노트

[PYTHON] 파이썬에서 페이징 출력

PYTHON

파이썬에서 페이징 출력

git log와 비슷한 것을 구현하려고하는데, 로그의 길이가 일정한 경우에만 출력 페이지가 표시됩니다. 당신이 git에 익숙하지 않다면, 나는 이것을 달성하기 위해 근본적으로 노력하고있다.

python some_script.py | less

python2.6 / pydoc.py의 페이징 구현에 대한 도움으로이 문제를 해결할 수있었습니다.

import os
text = '...some text...'
pipe = os.popen('less', 'w')
pipe.write(text)
pipe.close()

위대한 작품이지만 os.popen ()은 더 이상 사용되지 않습니다. 내가 임시 파일에 쓰기를 고려하고 그 경로로 전화를 덜 호출하지만 이상적인 것 같지 않습니다. 하위 프로세스에서도 가능합니까? 다른 아이디어?

편집하다:

그래서 하위 프로세스가 작동했습니다. 나는 Popen.communicate (텍스트)로 텍스트 변수를 줄 수 있었지만 실제로 인쇄 명령문을 리다이렉트하고 싶기 때문에 이것에 정착했다 :

  import os, sys, subprocess, tempfile

  page = True
  if page:
      path = tempfile.mkstemp()[1]
      tmp_file = open(path, 'a')
      sys.stdout = tmp_file
  print '...some text...'
  if page:
      tmp_file.flush()
      tmp_file.close()
      p = subprocess.Popen(['less', path], stdin=subprocess.PIPE)
      p.communicate()
      sys.stdout = sys.__stdout__     

물론, 나는 그것을 함수로 싸서 끝낼 것이다. 누구든지 그 문제를 보나요?

해결법

  1. ==============================

    1.대신 subprocess.Popen을 사용하십시오.

    대신 subprocess.Popen을 사용하십시오.

    http://docs.python.org/library/subprocess.html#subprocess-replacements

    http://docs.python.org/library/subprocess.html#subprocess.Popen

    os.popen 문서에는 이것에 대한 메모가 있습니다.

    http://docs.python.org/library/os.html#os.popen

  2. ==============================

    2.이것은 어떤가요:

    이것은 어떤가요:

    import pydoc
    text = '... some text ... '
    pydoc.pager(text)
    

    이것은 (내 opensuse 리눅스 박스에서) 페이저 (나의 경우에는 less)에 텍스트를 보내고, 파이썬 인터프리터 내에서 "help (... python command ...)"를 호출하는 것과 똑같이 작동한다.

  3. ==============================

    3.코드에서 명시 적으로 사용하는 것이 좋으므로 표준 인쇄 함수 대신 printc () 특수 인쇄 함수를 사용하는 것으로 나타납니다. subprocess.call ()을 사용하는 것만으로도 충분합니다 (파이프 기계가 필요 없음). 또한 임시 파일의 이름을 저장하지 않아도 변수를 저장할 수 있습니다.

    코드에서 명시 적으로 사용하는 것이 좋으므로 표준 인쇄 함수 대신 printc () 특수 인쇄 함수를 사용하는 것으로 나타납니다. subprocess.call ()을 사용하는 것만으로도 충분합니다 (파이프 기계가 필요 없음). 또한 임시 파일의 이름을 저장하지 않아도 변수를 저장할 수 있습니다.

    from __future__ import print_function
    
    import subprocess, tempfile
    
    page = True  # For tests
    
    # Definition of a printc() function that prints to the correct output
    if page:
        tmp_file = open(tempfile.mkstemp()[1], 'w')  # No need to store the name in a specific variable
        def printc(*largs, **kwargs):
            if 'file' not in kwargs:  # The code can still use the usual file argument of print()
                kwargs['file'] = tmp_file  # Forces the output to go to the temp file
            print(*largs, **kwargs)
    else:
        printc = print  # Regular print
    
    # Main program:
    
    printc('...some text...', 'some more text', sep='/')  # Python3 syntax
    
    # Paging of the current contents of the temp file:
    if page:
        tmp_file.flush()  # No need to close the file: you can keep printing to it
        subprocess.call(['less', tmp_file.name])  # Simpler than a full Popen()
    

    이렇게하면 Python 3의 인쇄 기능에 융통성이 생기고 멋진 인쇄 작업을한다는 코드가 명시됩니다. 이 코드는 코드의 일부 위치에서 "전역"sys.stdout 변수를 수정하는 것보다 큰 프로그램에서 더 잘 확장됩니다.

  4. ==============================

    4.외부 명령을 실행하는 것을 싫어해서 순수한 파이썬에서 호출기를 썼다. 여전히 문제가 있습니다. 파이프 입력은 Windows에서만 작동합니다.

    외부 명령을 실행하는 것을 싫어해서 순수한 파이썬에서 호출기를 썼다. 여전히 문제가 있습니다. 파이프 입력은 Windows에서만 작동합니다.

  5. from https://stackoverflow.com/questions/6728661/paging-output-from-python by cc-by-sa and MIT license