Python 3.4에서 새로운 히스토리 기능을 비활성화하려면 어떻게해야합니까?


10

Python 3.4로 업그레이드 한 후 모든 대화식 명령이에 기록됩니다 ~/.python_history. 파이썬 이이 파일을 작성하거나 쓰지 않기를 바랍니다.

/dev/null작동하지 않는 심볼릭 링크를 만들면 Python에서 파일을 제거하고 다시 만듭니다. 문서는 을 삭제 제안 sys.__interactivehook__하지만,이 또한 탭 완성 기능을 제거합니다. 이 히스토리 파일 작성을 비활성화하지만 탭 완성을 유지하려면 어떻게해야합니까?

추가 세부 사항:


뿌리를 내려고 노력 했습니까?
goldilocks

@goldilocks 나는 수용 가능한 해결책을 고려하지 않으며 어느 것도 사용하지 않습니다 chattr. 단일 (사용자) 구성 파일 또는 환경 변수를 찾고 있습니다.
Lekensteyn

알았지 만 문서를 살펴본 결과 수용 가능한 해결책이 없다는 것을 이미 알고 있습니다.
goldilocks

사실, 몇 주 전에이 버그 보고서 에서 chmod파이썬 개발자가 제안한 솔루션 이지만 거기에 대한 언급도 있습니다 ( 라이브러리 기능을 제외하고는 BTW 는 없습니다 ). ~/.inputrcman readline
goldilocks

@goldilocks 예, 해당 버그 보고서에 연결하려고했습니다. inputrc그래도 사용 방법을 모르고 chmod나에게도 효과가 없습니다. 어쨌든 파일이 수정됩니다 (Arch Linux). 거기에 존재하는 info inputrc페이지는하지만 일반적으로 그들이 통해 이동하기 어려운로 정보 페이지를 읽기에 너무 행복하지 않다.
Lekensteyn

답변:


7

Python 3.6부터 readline.set_auto_history 를 사용하여이를 비활성화 할 수 있습니다 .

import readline
readline.set_auto_history(False)

그것은 파이썬 쉘에는 좋지만 조심하십시오 : ipython에서는 작동하지 않는 것 같습니다.
z0r

이력을 완전히 비활성화합니다. 개인적으로 통역사 세션에서 기록이 보존되는 것은 좋지만, 내 기록이 디스크에 기록되고 세션 전체에 보존되는 것을 원하지 않습니다.
jamesdlin

작동하지 않습니다. 이렇게하면 파일 저장이 중지되지 않고 세션 중에 기록이 중단됩니다. 어쨌든 파이썬은 다음에 실행할 때 자동으로 "기능"을 다시 설정합니다.
Boann

5

이것은 나를 위해 작동합니다.

~/.pythonrc파일 작성 :

import os
import atexit
import readline

readline_history_file = os.path.join(os.path.expanduser('~'), '.python_history')
try:
    readline.read_history_file(readline_history_file)
except IOError:
    pass

readline.set_history_length(0)
atexit.register(readline.write_history_file, readline_history_file)

그런 다음 내보내십시오.

export PYTHONSTARTUP=~/.pythonrc

이 보인다 수 있도록 기록 파일을 작성하는 대신 비활성화 내가 잘못 아니에요 경우를? set_history_length마법적인 것이 아니라면 ? 히스토리가 아닌 기능에 대해 탭 완성이 수행됩니다.
Lekensteyn

@Lekensteyn : 예, 기록 크기가 0이되므로 기록 파일에 아무것도 기록되지 않습니다. 아, 나는 세션 사이에 명령을 유지하고 싶지만.
cuonglm

2
이로 인해 여전히 ~/.python_history기록됩니다 (로 확인 PYTHONSTARTUP=$HOME/.pythonrc strace -e file,write -o /tmp/st python). 이 기능을 비활성화 할 수있는 방법이 없다고 생각하기 시작하지만의 코드를 복제하지 않고 탭 완성을 유지하십시오 /usr/lib/python3.4/site.py.
Lekensteyn

AFAIK, 실제로 비활성화 할 수있는 방법이 없습니다.
cuonglm

2

또 다른 ~ / .pythonrc 솔루션 :

import readline
readline.write_history_file = lambda *args: None

왜 이것이 더 많이지지되지 않는지 모르겠습니다. 이것은 간단하고 히스토리를 완전히 비활성화하는 대신 히스토리 파일 작성을 직접 억제 합니다.
jamesdlin 19

이것은 나를 위해 일한 유일한 수정이었습니다. 감사.
Boann

1

쓰기에서 파이썬을 방지하기 위해 ~/.python_history, 후크 해제 이 기능을 활성화 :

import sys
# Disable history (...but also auto-completion :/ )
if hasattr(sys, '__interactivehook__'):
    del sys.__interactivehook__

탭 완성을 활성화하고 기록 기능을 비활성화하려는 경우 site.enablerlcompleter코드를 조정할 수 있습니다 . 에 다음 코드를 작성 ~/.pythonrc하고 설정 export PYTHONSTARTUP=~/.pythonrc을 활성화하기 위해 쉘.

import sys
def register_readline_completion():
    # rlcompleter must be loaded for Python-specific completion
    try: import readline, rlcompleter
    except ImportError: return
    # Enable tab-completion
    readline_doc = getattr(readline, '__doc__', '')
    if readline_doc is not None and 'libedit' in readline_doc:
        readline.parse_and_bind('bind ^I rl_complete')
    else:
        readline.parse_and_bind('tab: complete')
sys.__interactivehook__ = register_readline_completion

0

파이썬 자체에서 어떤 식으로 고정 될 때까지 UNIX 시스템 에서이 작업을 수행 할 수 있습니다.

rm ~/.python-history
mkdir ~/.python-history
sudo chattr +i ~/.python-history || sudo chflags simmutable ~/.python-history

그 후 당신은 얻을 것이다

atexit._run_exitfuncs 오류 :

IsADirectoryError : [Errno 21] 디렉토리입니다

파이썬 쉘을 종료 할 때마다 종료 상태는 계속 유지됩니다 0.

파일로 남겨두면 다른 파일을 작성하고 변경할 수 없게해야합니다. ~/.python_history


0

다음을 파일에 넣고 설정 PYTHONSTARTUP하십시오 (또는 파일을 호출하여 sitecustomize.py에서 액세스 할 수 있도록하십시오 PYTHONPATH)

import readline
import atexit
import sys

sys.__interactivehook__()
atexit.unregister(readline.write_history_file)

이렇게하면 탭 완성 및 이전 기록에 계속 액세스 할 수 있지만 입력 한 명령은 기록 파일에 추가되지 않습니다.


이것은 작동하지 않는 것 같습니다 (Arch Linux의 Python 3.5.1). 이력 파일은 PYTHONSTARTUP스크립트가 실제로 실행 되어도 종료시 여전히 기록됩니다 .
Lekensteyn

방금 Arch Linux vm에서 테스트했으며 정상적으로 작동합니다. gist.github.com/berdario/640b3ab00b128fdf3338
berdario

0

여기 내 방법이 있습니다 (기본적으로 berdario 방법의보다 안정적이고 파이썬 버전 임). 에 대한 쓰기는 비활성화 .python_history하지만 존재하는 경우에는 읽지 못하거나 현재 인스턴스 히스토리에 새 행을 추가하지 않습니다. 나는로 저장하는 것이 좋습니다 site-packages/sitecustomize.py때문에 site모두 기록하는 모듈 .python_history과 수입 sitecustomize이있는 경우는 그에게 뭔가 다른 이름을 지정하고 그것을 가리키는 있지만, PYTHONSTARTUP너무 작품.

import sys
oldhook = getattr(sys, '__interactivehook__', None)
if oldhook:
    def newhook():
        import readline, atexit
        oldhook()
        atexit.unregister(readline.write_history_file)
    sys.__interactivehook__ = newhook

업데이트 : pep8이 아닌 내 시스템에 대해 3.7에서 수행 한 작업 :

import rlcompleter,readline as r,sys
def f():r.parse_and_bind('tab:complete');r.read_init_file()
sys.__interactivehook__=f

파이썬 3.7.3. 작동하지 않는. 기록이 여전히 기록되었습니다.
Boann

0

내 현재 솔루션 (최신 버전의 Python 3의 경우)은 ~ / .python_history의 기본 사용을 막지 만 readline.write_history_file (filename) 또는 readline.append_history_file (... ))는 PYTHONSTARTUP 파일에 다음을 포함해야합니다.

import readline
import time

readline.add_history("# " + time.asctime()) # prevent default use of ~/.python_history
readline.set_history_length(-1) # unlimited

통역사의 시작 시간과 함께 명시 적으로 작성된 기록에 라벨을 붙이는 유쾌한 부작용이 있습니다. 여기서 볼 수있는 버그 5845 의 수정으로 인해 작동 합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.