当一个python脚本正在在IPython的交互运行检测(Detecting when a python script is being run interactively in ipython)

是否有一个Python脚本的方式来自动检测是否正在交互还是不跑? 可替代地,人们可以检测IPython中是否正在使用相对于常规的C蟒可执行?

背景:我的Python脚本通常有一个呼叫退出()在其中。 不时,我运行脚本交互的调试和分析,通常在IPython中。 当我以交互方式运行,我想取消退出呼叫。

澄清

假设我有一个剧本,myscript.py,看起来像:

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

有时候,我想运行,我已经开始了IPython的会话中的脚本,说是这样的:

In [nnn]: %run -p -D myscript.pstats myscript.py

在脚本的末尾,出口()调用将导致IPython的挂起,同时它问我,如果我真的要退出。 这是一个小麻烦,而调试(太轻微了我关心),但它可以弄乱分析结果:出口迅速被包括在配置文件中的结果(使分析难度,如果我开始之前去上午餐分析会话) 。

我想是的东西,让我修改我的脚本,所以它看起来像:

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

Answer 1:

我stumbed的追随者,似乎这样的伎俩对我来说:

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


Answer 2:

文件说, 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.")

可以通过福兹先生描述添加IPython的支持。



Answer 3:

当调用交互,蟒蛇将运行$ PYTHONSTARTUP脚本,所以你可以简单地有一个环境变量调用脚本设置全局