2009-07-31 109 views
6

python脚本是否有办法自动检测它是否以交互方式运行?或者,可以检测是否使用ipython而不是常规的c python可执行文件?检测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 

在脚本的结束,出口()调用将导致IPython中,同时它挂如果我真的想退出,那么我就可以了。调试时这是一个小问题(对于我来说太小了),但它可能导致分析结果混乱:退出提示包含在配置文件结果中(如果我在开始进行配置文件会话之前启动分析会使分析更加困难) 。

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

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

回答

13

我以下stumbed,似乎这样的伎俩对我来说:

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

你用`python`获得的标准交互式shell怎么样? – n611x007 2014-08-28 10:22:26

2

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

3

文档说sys.ps1不以非交互模式存在。此外,可以使用sys.flags(用于python 2.6+)来检测我们是否使用了python -i <whatever>

这个脚本检测我们是否以交互方式,非交互​​方式和死后模式运行(如果隐式地使用python -i调用python解释器,并且用户认为他已登陆到“交互”控制台,则可能归因于交互模式):

#!/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." 

可以按照Mr Fooz的描述添加IPython支持。

+0

这在PyCharm控制台中是错误的。 – 2017-06-10 19:24:27

相关问题