Pythonコマンドラインを終了するには、exit()と入力する必要があります。exitと入力すると、
Use exit() or Ctrl-Z plus Return to exit
通常、と入力exitすると、プログラムを終了します。コマンドラインを終了しようとしていることがわかっているのに、インタープリターが上記のエラーを表示するのはなぜですか?なぜ終了しないのですか?私はそれが問題ではないことを知っていて、それがばかげた質問ですが、私は好奇心が強いです。
Pythonコマンドラインを終了するには、exit()と入力する必要があります。exitと入力すると、
Use exit() or Ctrl-Z plus Return to exit
通常、と入力exitすると、プログラムを終了します。コマンドラインを終了しようとしていることがわかっているのに、インタープリターが上記のエラーを表示するのはなぜですか?なぜ終了しないのですか?私はそれが問題ではないことを知っていて、それがばかげた質問ですが、私は好奇心が強いです。
回答:
私のpythonインタプリタでexitは、実際には関数ではなく文字列です- 'Use Ctrl-D (i.e. EOF) to exit.'。次のように入力して、通訳を確認できます。type(exit)
アクティブなpythonで起こっているのは、exitが関数であることです。関数を呼び出さない場合、オブジェクトの文字列表現が出力されます。これは、返されるオブジェクトのデフォルトの動作です。デザイナーがexitと入力してインタープリターを終了しようとするのではないかと考えたため、exit関数の文字列表現を役立つメッセージにしました。str(exit)またはを入力して、この動作を確認できますprint exit。
これは私にとってはうまくいきます。Pythonプロンプトから抜ける最善の方法です。
出口()
exit()うまくいくことを知っていると言います、そして彼らexitは括弧なしではうまくいかない理由を知りたいのです。したがって、この回答は質問の一部を繰り返すだけで、実際には回答しません。
あなたが入力するとexit、コマンドラインでは、その名前と呼び出しで変数を見つける__repr__(または__str__それに)。通常、次のような結果が得られます。
<function exit at 0x00B97FB0>
しかし、彼らはその機能を exitオブジェクトが役に立つメッセージを表示するように。それが愚かな振る舞いであるかどうかは主観的な質問ですが、「ただ終了する」だけではない理由の1つは次のとおりです。
たとえば、デバッガーのコードを見ていて、オブジェクトの1つがexit関数を参照しているとします。デバッガー__repr__がそのオブジェクトを呼び出してその関数を表示しようとすると、プログラムが突然停止します。それは本当に予期せぬことであり、対策をさらに複雑にする可能性があります(たとえば、その動作をコマンドラインに制限したexitとしても、属性を持つオブジェクトを印刷しようとするとどうなりますか?)
import sys、インタープリターを終了するためにsys.exit()を呼び出す必要がない限り、スコープ内にもありません。
でPythonインタープリターを終了することをお勧めしますCtrl-D。これは、ファイルの終わりまたは伝送の終わりのための古いASCIIコードです。
Ctrl-BreakWindowsで一貫して動作します。Ctrl-DまたはCtrl-Z、Python 2.7、3.4、3.6のWindowsで動作しました。しかし、Python 3.7ではこれらは機能しなくなり、終了する最短のASCIIシーケンスはCtrl-Z Enterです。
WindowsでAnaconda 4.5+およびPython 3.6+を使用
Ctrl+Z
または
exit()
場合によっては、使用する必要があります
Ctrl+Break
あなたはそれを修正することができます。
PYTHONSTARTUP次のようにPythonファイルにリンクします
# Make exit work as expected
type(exit).__repr__ = type(exit).__call__
これはどのように作動しますか?
pythonコマンドラインはread-evaluate-print-loopです。つまり、テキストを入力すると、そのテキストを読み取って評価し、最終的に結果を出力します。
あなたが入力するとexit()、それはタイプの呼び出し可能オブジェクトに評価site.Quitterし、その呼び出し、__call__システムを終了機能を。入力exitすると、同じ呼び出し可能オブジェクトに評価されますが、呼び出さずにオブジェクトが出力され、次に呼び出されます__repr__れます。
かっこなしで入力した場合でも、リンク__repr__すること__call__でこれを利用して、システムを終了するという期待される動作を得るexitことができます。
exit「役立つ」文字列を出力するように努力しましたが、自然なことをするためにそれをバインドしてインタープリターを終了することはできませんでした。毎回括弧をタイプしなければならないのはイライラします。この答えは完璧で、代わりに受け入れられるべきです。
()最後に関数がどのように呼び出されるかと関係があるかもしれません...そうでない場合、それは(おそらく)変数かもしれません...または何らかのオブジェクトです...