Pythonスクリプトがipythonでインタラクティブに実行されていることを検出する
-
06-07-2019 - |
質問
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)
解決
次のことにつまずいたのですが、私にとってはうまくいくようです:
def in_ipython():
try:
__IPYTHON__
except NameError:
return False
else:
return True
他のヒント
ドキュメントには、非対話モードではsys.ps1
は存在しないと書かれています。さらに、sys.flags
(Python 2.6+の場合)を使用して、python -i <whatever>
を使用したかどうかを検出できます。
このスクリプトは、インタラクティブ、非インタラクティブ、および事後分析モードで実行されているかどうかを検出します(python -i
を使用してpythonインタープリターが暗黙的に呼び出され、ユーザーが<!> quot; interactive <!> quot; console):
#!/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の説明に従って追加できます。
インタラクティブに呼び出されると、pythonは$ PYTHONSTARTUPでスクリプトを実行します。そのため、単純にその環境変数にグローバルを設定するスクリプトを呼び出させることができます