检测Python脚本在IPython中交互式运行的情况
有没有办法让一个Python脚本自动检测自己是被交互式运行还是以其他方式运行?或者说,能不能判断是用IPython在运行,还是用普通的C Python执行文件?
背景:我的Python脚本里通常会有一个exit()的调用。有时候,我会在调试和性能分析时以交互方式运行这些脚本,通常是在IPython中。当我以交互方式运行时,我希望能跳过exit的调用。
说明:
假设我有一个脚本,叫做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
文档说在非交互模式下,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 的支持。
14
我偶然发现了以下内容,似乎对我很有帮助:
def in_ipython():
try:
return __IPYTHON__
except NameError:
return False