まず、対話モードでは、呼び出された関数からの戻り値が出力されません。代わりに、ユーザーが入力した式の結果を出力します。それが関数呼び出しでない場合でも、出力されます。3 つの関数呼び出しがある場合でも、3 行ではなく 1 つの結果が出力されます。等々。
したがって、関数の戻り値を stdout にリダイレクトしようとするのは間違っています。
対話型インタープリターが行うことは、次のようなものです。
line = raw_input(sys.ps1)
_ = eval(line)
if _ is not None:
print repr(_)
sys.ps1
(対話型プロンプトから変更して、プロンプトの外観を変更したり、アクセス_
して最後の値を取得したりできることに気付くかもしれません。)
しかし、実際にはそうではありません。そして、それはあなた自身がこれに取り組むべき方法でもありません。試してみると、独自のものをglobals
ユーザーのものから分離し、ステートメントと式を処理し、複数行のステートメントと式を処理するなどの複雑さに対処する必要があります (実行するのraw_input(sys.ps2)
は簡単ですが、いつそれを行うべきかをどのように知っていますか? )、readline
および との適切な相互作用rlcomplete
など。
これを行う簡単な方法を説明するカスタム Python インタープリターと呼ばれるドキュメントのセクションがあります。
この章で説明するモジュールを使用すると、Python の対話型インタープリターに似たインターフェイスを作成できます。Python 言語に加えて特別な機能をサポートする Python インタープリターが必要な場合は、code
モジュールを参照する必要があります。
そしてcode
:
… Python で read-eval-print ループを実装する機能を提供します。対話型インタープリター プロンプトを提供するアプリケーションを構築するために使用できる 2 つのクラスと便利な関数が含まれています。
アイデアは、あなたが引き継ぎたいレベルまで、Pythonにすべての難しいことを任せてから、その上にその部分を書くだけだということです.
IDLE
、ipython
、などのソースを参考にしてくださいbpython
。