2009-07-31 2 views
6

対話的に実行されているかどうかをpythonスクリプトが自動的に検出する方法はありますか?あるいは、普通のc python実行可能ファイルと比較してipythonが使用されているかどうかを検出できますか?Pythonスクリプトがipythonでインタラクティブに実行されていることを検出する

背景:私のpythonスクリプトは一般に、exit()を呼び出す必要があります。時々、私はスクリプトを対話的にデバッグとプロファイリングのためにipythonで実行します。インタラクティブに実行しているときに、終了する呼び出しを抑制したいと思います。

明確化:時々、私はすでに開始していることをIPythonセッション内でスクリプトを実行するために

#!/usr/bin/python 
...do useful stuff... 
exit(exit_status) 

たい:

私がどのように見えるのスクリプト、myscript.pyをしていると仮定

スクリプトの最後では、exit()を呼び出すとipythonがハングするもし私が本当に退出したいなら、私をスキップしてください。これは、デバッグ中に私が気にするには軽微ですが、プロファイリングの結果を混乱させる可能性があります。終了プロンプトはプロファイル結果に含まれます(プロファイリングセッションを開始してから昼食に行く前に分析を難しくします) 。

私がしたいことは、それがどのように見えるので、私は私のスクリプトを変更することができますものです:

#!/usr/bin/python 
...do useful stuff... 
if is_python_running_interactively(): 
    print "The exit_status was %d" % (exit_status,) 
else: 
    exit(exit_status) 

答えて

13

を設定するスクリプトを呼び出すと、私のためにトリックを行うようだ:

def in_ipython(): 
    try: 
     __IPYTHON__ 
    except NameError: 
     return False 
    else: 
     return True 
+0

'python'で手に入れた標準のインタラクティブシェルはどうですか? – n611x007

2

対話的に呼び出されたときに作成されている環境変数を持つことができるので、Pythonは、$ PYTHONSTARTUPでスクリプトを実行します私は次のようにstumbedグローバル

3

ドキュメントがのことを言いますは非対話モードでは存在しません。さらにsys.flags(Python 2.6+用)を使用して、python -i <whatever>を使用したかどうかを検出できます。

このスクリプトは、私たちがインタラクティブに、インタラクティブではなく、死後モードであるかどうかを検出します(python -iを暗黙的に使用してPythonインタプリタが呼び出され、ユーザがインタラクティブなコンソールに着いたと判断した場合)

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 

# IPython recognition is missing; test here if __IPYTHON__ exists, etc. 

if hasattr(sys, 'ps1'): 
    print "Running interactively." 
else: 
    print "Not running interactively..." 
    if sys.flags.interactive: 
     print "... but I'm in interactive postmortem mode." 

IPythonのサポートは、Mr Foozの記述どおりに追加できます。

+0

これはPyCharmコンソールでは間違っています。 –

関連する問題