web-dev-qa-db-ja.com

変更Pythonインタラクティブプロンプト ">>>"

これはおそらくばかげた質問であり、理解したら削除することになるでしょうが、Python 3.5のドキュメントで、>>>を変更する方法を読んだことを思い出します。 Python help()を呼び出すとhelp>に変更されるなどのインタラクティブなプロンプト。しかし、何らかの理由で、戻って試して覚えておくと、それへの指示が見つかりません。これが可能かどうか誰かが知っていますか、それとも私はただ物事を想像していますか?

ありがとう

20
MutantOctopus

あなたは正しく覚えています。

sys モジュール(sys.ps1&sys.ps2)にあります:

インタプリタのプライマリおよびセカンダリプロンプトを指定する文字列。これらは、インタプリタがインタラクティブモードの場合にのみ定義されます。この場合の初期値は「>>>」と「...」です。文字列以外のオブジェクトがいずれかの変数に割り当てられている場合、インタプリタが新しい対話型コマンドを読み取る準備をするたびに、そのstr()が再評価されます。これは、動的プロンプトを実装するために使用できます。

例えば:

 >>> import sys 
 >>> sys.ps1 = "3.5 >>>" 
 3.5 >>> sys.ps2 = "3.5 ..." 
 3.5 >>> 
21
Gerrat

次のいずれかに設定するのは素晴らしいことです。

  1. より良い視覚的側面のための
  2. コピー/貼り付け操作を簡単にするための空白またはスペース

これをbashシェルに貼り付けます。

tee ~/.pyrc <<EOF
#!/usr/bin/env python3
import sys
sys.ps1='\x1b[1;49;33m>>>\x1b[0m '  # bright yellow
sys.ps2='\x1b[1;49;31m...\x1b[0m '  # bright red
#sys.ps1='\x1b[33m>>>\x1b[0m '      # dark yellow
#sys.ps2='\x1b[31m...\x1b[0m '      # dark red

# For easy copy/paste of proper code, use a blank or space:
#sys.ps1=' '
#sys.ps2=' '
EOF

# Then do this:
chmod 755 ~/.pyrc

最後に、この行を~/.bash_profileに追加します。

export PYTHONSTARTUP=~/.pyrc

楽しい!

enter image description here

3
not2qubit

Windows(_cmd.exe_)を使用していて、色付きのプロンプトが必要な場合は、coloramaを使用できますが、いくつかの注意点があります。 PYTHONSTARTUPで_colorama.init_を呼び出し、_sys.ps1_に色付きエスケープコードを含む文字列を割り当てると、機能しません。ただし、色付きのエスケープコードを含む文字列を使用してprintを呼び出すと、色付きの出力は機能します。

幸いなことに、_sys.ps1_を思いついたPythonの人々は、文字列だけでなく、任意のオブジェクトを_ps1_として使用できるほど寛大でした(または賢いですか?)。次に、オブジェクトは___str___メソッドを使用して文字列に変換されます。これは、Promptなどの独自のクラスを定義できることを意味します。 、および___str___メソッドでanythingを実行します。これには、coloramaでラップされたstdoutへの書き込みも含まれます(これは機能します)。次に、空の文字列を返すだけです。

この事実はあなたに素晴らしいボーナスをもたらします-あなたは非定数プロンプトを使用することもできます。 Python Shellにbashのように日付を入れますか?問題ありません。

_import sys
import datetime
import colorama

colorama.init(autoreset=True)

class Prompt:
  def __str__(self):
    print(self.Prompt, end='')
    return ''

class PS1(Prompt):

  @property
  def Prompt(self):
    return '{brace_c}[{time_c}{time}{brace_c}]{Prompt_c}>>> '.format(
              brace_c  = colorama.Fore.BLACK + colorama.Style.BRIGHT,
              # style is preserved, so the following are also bright:
              Prompt_c = colorama.Fore.LIGHTYELLOW_EX,
              time_c   = colorama.Fore.BLACK,
              time     = datetime.datetime.now().strftime('%H:%M'),
            )

sys.ps1 = PS1()
_

これは問題なく機能しますが、___str___メソッドの目的はstrインスタンスを返すことであるため、かなりハックな方法です。このため、_sys.ps2_で同じことをすると壊れます。 Pythonインタープリターは、___str___メソッドに副作用がないことを期待しており、PS1を印刷するときにstr(sys.ps1)str(sys.ps2)の両方を評価しているようです。 PS2を印刷するときは、すでに評価された(そして保存された)str(sys.ps2)の値が使用されます。その結果、上記の_PS2_と同様の_PS1_クラスを作成すると、 PS1のみを表示する必要がある場合はPS1PS2の両方を表示し、PS2を表示する必要がある場合は何も表示されません。これがうまく機能しないもう1つのケースは、複数のスレッド/プロセスの場合です。その後、複数のスレッドからの出力がインターリーブされます。これは通常のPS1でも発生する可能性がありますが、このハッキングによりさらに悪化します。

編集:スクリーンショット

screenshot

この単純な例では、それほど悪くはありませんが(インターリーブがなく、色がめちゃくちゃになっているだけです)、タイミングを「正しく」取得すると、さらに悪化する可能性があります。

1
kyrill