15

以前の Python インタープリターで入力したコマンドに「上矢印」できるようにしたいと思います。、、 などのreadline機能を提供するモジュールを見つけました。私はこれを実践するのに十分なほど精通していないので、誰か助けてもらえますか? 解決策についての私の考えは次のとおりです。read_history_filewrite_history_fileset_startup_hook

(1) .login PYTHONSTARTUP を変更して、Python スクリプトを実行します。(2) その python スクリプト ファイルで次のようにします。

def command_history_hook():
    import readline
    readline.read_history_file('.python_history')
command_history_hook()

(3) インタプリタが終了するたびに、履歴をファイルに書き込みます。これを行う最善の方法は、起動スクリプトで関数を定義し、その関数を使用して終了することだと思います。

def ex():
    import readline
    readline.write_history_file('.python_history')
    exit()

ただし、括弧を使用して終了する必要があるのは非常に面倒ですex()ex(括弧なしで)ex関数を実行できるようにするpythonシュガーはありますか?

履歴ファイルを毎回書き込むためのより良い方法はありますか? すべての解決策/提案を前もって感謝します。

また、私が見ることができるように、2 つのアーキテクチャの選択肢があります。1 つの選択肢は、統一されたコマンド履歴を持つことです。利点は単純さです (次の代替方法では、ホーム ディレクトリに多くのファイルが散らばっています)。欠点は、別々のターミナルで実行するインタープリターが互いのコマンド履歴を取り込まれ、互いの履歴が上書きされることです。(私は通常、インタープリターを閉じてすぐに開き直してモジュールをリロードすることに関心があるので、これで問題ありません。その場合、インタープリターのコマンドはファイルに書き込まれます。)端末ごとに個別の履歴ファイルを維持するための1つの可能な解決策作成する新しい端末ごとに環境変数を書き込むことです。

def random_key()
    ''.join([choice(string.uppercase + string.digits) for i in range(16)])

def command_history_hook():
    import readline
    key = get_env_variable('command_history_key')
    if key:
        readline.read_history_file('.python_history_{0}'.format(key))
    else:
        set_env_variable('command_history_key', random_key())

def ex():
    import readline
    key = get_env_variable('command_history_key')
    if not key:
        set_env_variable('command_history_key', random_key())
    readline.write_history_file('.python_history_{0}'.format(key))
    exit()

ランダム キーの長さを 16 から 1 に減らすことで、重複の可能性 (2.8% の確率) を犠牲にして、ディレクトリに散らばるファイルの数を 36 に減らすことができます。

4

5 に答える 5

13

Pythonドキュメントの提案は、あなたが望むものをほぼカバーしていると思います。セクション13.3の終わりにあるpystartupファイルの例を見てください。

またはこのページを参照してください:

しかし、これらすべてを提供するすぐに使えるインタラクティブシェルについては、IPythonの使用を見てください。

于 2009-07-27T08:02:14.003 に答える
4

IPythonをPythonシェルとして使用してみてください。それはすでにあなたが求めるすべてを持っています。最も人気のあるディストリビューション用のパッケージがあるため、インストールは非常に簡単です。

于 2009-07-27T08:01:30.340 に答える
0

すべてのファイルを使用せずに対話型の履歴置換を使用することだけが必要な場合は、readline をインポートするだけです。

import readline

その後、上/下キーを使用して過去のコマンドをナビゲートできます。2 や 3 も同様です。

これはドキュメントからはわかりませんでしたが、見逃したのかもしれません。

于 2015-07-15T20:07:58.693 に答える
0

PIP を使用してpyreadlineパッケージをインストールします。

pip install pyreadline
于 2013-12-21T12:19:12.100 に答える