これはおそらくばかげた質問であり、理解したら削除することになるでしょうが、Python 3.5のドキュメントで、>>>
を変更する方法を読んだことを思い出します。 Python help()
を呼び出すとhelp>
に変更されるなどのインタラクティブなプロンプト。しかし、何らかの理由で、戻って試して覚えておくと、それへの指示が見つかりません。これが可能かどうか誰かが知っていますか、それとも私はただ物事を想像していますか?
ありがとう
あなたは正しく覚えています。
sys モジュール(sys.ps1&sys.ps2)にあります:
インタプリタのプライマリおよびセカンダリプロンプトを指定する文字列。これらは、インタプリタがインタラクティブモードの場合にのみ定義されます。この場合の初期値は「>>>」と「...」です。文字列以外のオブジェクトがいずれかの変数に割り当てられている場合、インタプリタが新しい対話型コマンドを読み取る準備をするたびに、そのstr()が再評価されます。これは、動的プロンプトを実装するために使用できます。
例えば:
>>> import sys >>> sys.ps1 = "3.5 >>>" 3.5 >>> sys.ps2 = "3.5 ..." 3.5 >>>
次のいずれかに設定するのは素晴らしいことです。
これを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
楽しい!
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のみを表示する必要がある場合はPS1とPS2の両方を表示し、PS2を表示する必要がある場合は何も表示されません。これがうまく機能しないもう1つのケースは、複数のスレッド/プロセスの場合です。その後、複数のスレッドからの出力がインターリーブされます。これは通常のPS1でも発生する可能性がありますが、このハッキングによりさらに悪化します。
この単純な例では、それほど悪くはありませんが(インターリーブがなく、色がめちゃくちゃになっているだけです)、タイミングを「正しく」取得すると、さらに悪化する可能性があります。