7

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

背景: 私の python スクリプトには通常、exit() の呼び出しが含まれています。ときどき、スクリプトを対話的に実行してデバッグとプロファイリングを行います。通常は ipython を使用します。インタラクティブに実行しているときは、終了の呼び出しを抑制したいと考えています。

明確化:

次のようなスクリプト myscript.py があるとします。

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

場合によっては、既に開始している IPython セッション内で次のようにスクリプトを実行したいことがあります。

In [nnn]: %run -p -D myscript.pstats 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)
4

4 に答える 4

13

私は次のことに出くわしましたが、それは私にとってはうまくいくようです:

def in_ipython():
    try:
        return __IPYTHON__
    except NameError:
        return False
于 2009-07-31T14:37:48.667 に答える
3

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

このスクリプトは、対話型、非対話型、および事後分析モードで実行されているかどうかを検出します (Python インタープリターがpython -i暗黙的に呼び出され、ユーザーが "対話型" コンソールに到達したと考えている場合、対話型モードに起因する可能性があります)。

#!/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.")

Fooz 氏の説明に従って、IPython のサポートを追加できます。

于 2011-07-13T07:44:04.310 に答える
2

インタラクティブに呼び出されると、Python は $PYTHONSTARTUP でスクリプトを実行するため、その環境変数でグローバル変数を設定するスクリプトを呼び出すだけで済みます。

于 2009-07-31T14:21:01.503 に答える
2

見つけたすべての方法を比較し、結果の表を作成しました。最良のものはこれのようです:

hasattr(sys, 'ps1')

ここに画像の説明を入力

誰かが異なる可能性のある他のシナリオを持っている場合は、コメントして追加します

于 2020-10-25T12:54:51.213 に答える