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