source

인터랙티브 Python에서 전체 명령어 이력을 어떻게 보십니까?

bestscript 2022. 12. 24. 20:38

인터랙티브 Python에서 전체 명령어 이력을 어떻게 보십니까?

Mac OS X에서 기본 python interpreter를 사용하고 있으며 이전 명령어를 +(삭제)했습니다.K화살표 키를 사용하여 하나씩 살펴볼 수 있습니다.그런데 bash 쉘에 --history 옵션과 같은 옵션이 있나요?이 옵션은 지금까지 입력한 모든 명령어를 보여줍니다.

전체 이력을 인쇄하기 위한 코드:

파이썬 3

원라이너(빠른 복사 및 붙여넣기):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(또는 더 긴 버전...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

파이썬 2

원라이너(빠른 복사 및 붙여넣기):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(또는 더 긴 버전...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

주의:get_history_item()1부터n까지 인덱스가 붙습니다.

길이를 가져오고 각각을 보는 데 사용합니다.

python 3 interpreter를 사용하면 이력을 다음에 씁니다.
~/.python_history

이력을 파일에 쓰는 경우:

import readline
readline.write_history_file('python_history.txt')

도움말 기능은 다음을 제공합니다.

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

IPython의 경우%history -g명령어 이력의 전체를 나타냅니다.기본 설정에서는 사용자 디렉토리의 .python_history라는 파일에도 이력이 저장됩니다.

위의 내용은 python 3.x for python 3.x(구체적으로 3.5)에서만 작동하므로 유사하지만 약간의 수정이 필요합니다.

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

추가()에 주의합니다.

(셸 스크립트를 사용하여 .timeout_history를 해석하거나 python을 사용하여 위의 코드를 수정하는 것은 개인의 취향과 상황에 따라 다릅니다.)

@Jason-V씨, 정말 도움이 됩니다.감사합니다.그리고 이 예시를 찾아서 나만의 조각으로 구성했어요.

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

unix/bash 버전과 유사한 이력을 가져오는 간단한 함수입니다.

새로운 사람들에게 도움이 됐으면 좋겠어요.

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

단편:Python3에서 테스트 완료.python2에 결함이 있으면 알려주세요.샘플:

전체 이력:ipyhistory()

최근 10개의 이력:ipyhistory(10)

처음 10회 이력:ipyhistory(-10)

도움이 됐으면 좋겠군

그러면 다음 명령어가 별도의 행으로 출력됩니다.

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

Doogle의 답변의 리해시는 행 번호를 인쇄하지 않지만 인쇄할 행 수를 지정할 수 있습니다.

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))

언급URL : https://stackoverflow.com/questions/6558765/how-do-you-see-the-entire-command-history-in-interactive-python