检测在ipython中以交互方式运行python脚本的时间

时间:2009-07-31 14:15:59

标签: python interactive ipython

python脚本是否有办法自动检测它是否以交互方式运行?或者,可以检测是否正在使用ipython而不是常规的c python可执行文件吗?

背景:我的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 个答案:

答案 0 :(得分:13)

我绊倒了下面的内容,它似乎为我做了诀窍:

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

答案 1 :(得分:3)

文档说非{#1}}在非交互模式下不存在。另外,可以使用sys.ps1(对于python 2.6+)来检测我们是否使用过sys.flags

此脚本检测我们是否以交互方式,非交互​​方式运行以及在事后模式下运行(如果使用python -i <whatever>隐式调用python解释器,可能会将其归因于交互模式,并且用户认为他已进入“交互式”模式控制台):

python -i

如Fooz先生所述,可以添加IPython支持。

答案 2 :(得分:2)

当以交互方式调用时,python将在$ PYTHONSTARTUP中运行脚本,因此您可以简单地让该环境变量调用设置全局的脚本

答案 3 :(得分:2)

我比较了发现的所有方法,并制成了结果表。最好的似乎是这样:

package Vasu;
public class First {

    public int n = 5;
    public int m = 0;
    long[] arr = new long[n];

    public static void main(String[] args) {

        Second C = new Second();  // cannot make a static reference in a non static field 
        arr[n - m] = m;           // "
        C.rules(arr[n - m]);      // "
        m++;

    }
}
//-----------------------------------------
package Vasu;

import java.util.Arrays;

public class Second {
    public double rule;

    public void rules(long[] arr) {
        if (arr[n - m] > 2) { // m and n cant be resolved into a variable
            rule=1;
            System.out.println("Array: " + Arrays.toString(arr));
        }
    }
}

enter image description here

如果任何人有可能会有所不同的其他情况,请发表评论,我将其添加