web-dev-qa-db-ja.com

Pythonがインタラクティブモードであるかどうかを確認する

Pythonスクリプトで、インタプリタがインタラクティブモードであるかどうかを確認する方法はありますか?これは、たとえば、インタラクティブPythonセッションしてモジュールをインポートすると、わずかに異なるコードが実行されます(たとえば、ロギングがオフになります)。

私は pythonが-iモードにあるかどうかを教えてください を見て、そこでコードを試しましたが、その関数はPythonは、-iフラグを使用して呼び出されましたが、インタラクティブモードの呼び出しに使用されるコマンドが引数なしのpythonの場合は呼び出されません。

私が言いたいのはこのようなものです:

if __name__=="__main__":
    #do stuff
Elif __pythonIsInteractive__:
    #do other stuff
else:
    exit()
46
Chinmay Kanchi

__main__.__file__はインタラクティブインタプリタに存在しません:

import __main__ as main
print hasattr(main, '__file__')

これは、python -cを介して実行されるコードにも当てはまりますが、python -mには当てはまりません。

sys.ps1 および sys.ps2 はインタラクティブモードでのみ定義されます。

23
ChristopheD

From [〜#〜] tfm [〜#〜] :インターフェイスオプションが指定されていない場合、-iが暗黙指定され、sys.argv [0]は空の文字列( "")であり、現在のディレクトリです。 sys.pathの先頭に追加されます。

前述のように、ユーザーがpythonを使用して引数なしでインタープリターを呼び出した場合は、if sys.argv[0] == ''を使用してこれをテストできます。これは、python -iで開始した場合にもtrueを返しますが、ドキュメントによると、機能的には同じです。

7
wersimmon

使用する - sys.flags

if sys.flags.interactive:
    #interactive
else:
    #not interactive 
6
Pych

以下は、-iスイッチがある場合とない場合の両方で機能します。

#!/usr/bin/python
import sys
# Set the interpreter bool
try:
    if sys.ps1: interpreter = True
except AttributeError:
    interpreter = False
    if sys.flags.interactive: interpreter = True

# Use the interpreter bool
if interpreter: print 'We are in the Interpreter'
else: print 'We are running from the command line'
1
jdines