Python 3.4の新しい履歴機能を無効にするにはどうすればよいですか?


10

Python 3.4へのアップグレード以降、すべてのインタラクティブコマンドはに記録され~/.python_historyます。Pythonでこのファイルを作成したり書き込んだりしたくありません。

へのシンボリックリンクの作成は/dev/null機能せず、Pythonはファイルを削除して再作成します。ドキュメントには、削除することを提案sys.__interactivehook__するが、これはまた、タブ補完が削除されます。この履歴ファイルの書き込みを無効にし、タブ補完を維持するにはどうすればよいですか?

追加の詳細:


あなたはそれを根絶することを試みましたか?
goldilocks 2014年

@goldilocks私は許容できるソリューションだとは考えていませんchattr。どちらもを使用していません。単一(ユーザー)の構成ファイルまたは環境変数を探しています。
Lekensteyn 14年

わかりましたが、ドキュメントを見たので、そのような許容できる解決策がないことはすでに知っています。
goldilocks 2014年

実際、数週間前のこのバグレポートchmodでpython開発者が提案した解決策はありますが、そこにはいくつかの言及もあります(ライブラリ関数を除いて、BTW はありません)。~/.inputrcman readline
goldilocks 2014年

@goldilocksはい、そのバグレポートにリンクしようとしていました。使用方法はわかりませんinputrcが、chmod動作しません。ファイルはとにかく変更されます(Arch Linux)。info inputrcページは存在しますが、情報ページをナビゲートするのが難しいため、情報ページを読むのは一般的にあまり満足できません。
Lekensteyn 14年

回答:


7

Python 3.6以降では、readline.set_auto_historyを使用してこれを無効にできます。

import readline
readline.set_auto_history(False)

これはPythonシェルには適していますが、注意してください。ipythonでは動作しないようです。
z0r

これにより、履歴が完全に無効になります。個人的には、インタプリタセッションで履歴を保持しても問題ありませんが、履歴をディスクに書き込んでセッション間で保持したくないだけです。
jamesdlin

動作しません。これはファイルの保存を停止するのではなく、セッション中に履歴を破壊します。いずれにせよ、Pythonは次に「機能」を実行したときに黙って「機能」を元に戻します。
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 14年

@Lekensteyn:はい、履歴サイズがゼロになるため、履歴ファイルには何も書き込まれません。ああ、私はあなたがセッション間でコマンドを保存したいのに。
cuonglm 2014年

2
これはまだ~/.python_history書き込まれます(で検証されますPYTHONSTARTUP=$HOME/.pythonrc strace -e file,write -o /tmp/st python)。これを無効にする方法はないと思い始めますが、からコードを複製せずにタブ補完を維持します/usr/lib/python3.4/site.py
Lekensteyn 14年

私の知る限り、本当にそれを無効にする方法はありません。
cuonglm 2014年

2

別の〜/ .pythonrcソリューション:

import readline
readline.write_history_file = lambda *args: None

なぜこれ以上賛成されないのか分かりません。これは単純で、履歴を完全に無効にするのではなく、履歴ファイルの書き込みを直接抑制します。
jamesdlin

これが私にとって有効な唯一の修正でした。ありがとう。
Boann、

1

Pythonがを書き込まないよう~/.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

Python自体で何らかの方法で修正されるまで、UNIXシステムでこれを行うことができます。

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

その後、あなたは得るでしょう

atexit._run_exitfuncsのエラー:

IsADirectoryError:[Errno 21]ディレクトリです

Pythonシェルを終了するたび。終了ステータスはそのままです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 2016

私は自分のArch Linux vmでテストしたところ、正常
berdario

0

これが私の方法です(これは基本的にberdarioの方法のより信頼性が高く、pythonicバージョンです)。への書き込みを無効にするだけで.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

Python 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.