[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.대신 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.이것은 어떤가요:
이것은 어떤가요:
import pydoc text = '... some text ... ' pydoc.pager(text)
이것은 (내 opensuse 리눅스 박스에서) 페이저 (나의 경우에는 less)에 텍스트를 보내고, 파이썬 인터프리터 내에서 "help (... python command ...)"를 호출하는 것과 똑같이 작동한다.
-
==============================
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.외부 명령을 실행하는 것을 싫어해서 순수한 파이썬에서 호출기를 썼다. 여전히 문제가 있습니다. 파이프 입력은 Windows에서만 작동합니다.
외부 명령을 실행하는 것을 싫어해서 순수한 파이썬에서 호출기를 썼다. 여전히 문제가 있습니다. 파이프 입력은 Windows에서만 작동합니다.
from https://stackoverflow.com/questions/6728661/paging-output-from-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 기본 인코딩을 설정하는 방법 (setdefaultencoding () 함수가 존재하지 않습니다)? [복제] (0) | 2018.11.15 |
---|---|
[PYTHON] 문자열 목록에서 문자 제거 (0) | 2018.11.15 |
[PYTHON] 장고 배경 작업 (0) | 2018.11.15 |
[PYTHON] 해골 음모의 전설을 다른 위치로 이동 하시겠습니까? (0) | 2018.11.15 |
[PYTHON] 목록을 정렬하지 않고 정렬되지 않은 목록의 N 번째 항목 찾기 (0) | 2018.11.15 |