在IPython中检测Python脚本是否以交互方式运行

9

有没有一种方法可以让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个回答

14

我偶然发现了下面的内容,它对我来说似乎解决了问题:

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

你用 python 得到的标准交互式 shell 怎么样? - n611x007

5

我比较了所有找到的方法,并制作了一个结果表格。最好的方法似乎是这个:

hasattr(sys, 'ps1')

在这里输入图片描述

如果有其他不同的情况,请留言,我会添加。


我的测试是在Windows 10上进行的,“shell”指的是cmd和Git Bash(结果相同)。 - pyjamas

4
文档说,在非交互模式下不存在 sys.ps1。此外,可以使用 sys.flags (适用于 Python 2.6+)来检测是否使用了 python -i <whatever>
该脚本可检测我们是否以交互、非交互和 post-mortem 模式运行(如果使用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.")

您可以按照Fooz先生的说明添加IPython支持。


3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接