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)
答案 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));
}
}
}
如果任何人有可能会有所不同的其他情况,请发表评论,我将其添加