62

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

python が -i モードであるかどうかを確認し、そこでコードを試してみましたが、その関数は、Python が -i フラグで呼び出された場合にのみ true を返し、インタラクティブ モードを呼び出すために使用されるコマンドにpython引数がない場合には返されません。 .

つまり、次のようなものです。

if __name__=="__main__":
    #do stuff
elif __pythonIsInteractive__:
    #do other stuff
else:
    exit()
4

7 に答える 7

70

__main__.__file__対話型インタープリターには存在しません:

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

これは、 経由で実行されるコードにも当てはまりますがpython -c、 ではありませんpython -m

于 2010-03-01T14:25:26.113 に答える
27

sys.ps1対話モードでsys.ps2のみ定義されます。

于 2010-03-01T14:27:50.197 に答える
14

使用sys.flags:

if sys.flags.interactive:
    #interactive
else:
    #not interactive 
于 2011-07-29T21:09:54.217 に答える
7

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

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

于 2010-03-01T14:30:18.400 に答える
1

以下は、-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'
于 2014-07-13T16:13:54.880 に答える
-3

ここにうまくいくものがあります。次のコード スニペットをファイルに配置し、そのファイルへのパスをPYTHONSTARTUP環境変数に割り当てます。

__pythonIsInteractive__ = None

そして、あなたは使用することができます

if __name__=="__main__":
    #do stuff
elif '__pythonIsInteractive__' in globals():
    #do other stuff
else:
    exit()

http://docs.python.org/tutorial/interpreter.html#the-interactive-startup-file

于 2011-07-07T18:03:24.753 に答える