检测Python脚本在IPython中交互式运行的情况

9 投票
4 回答
4350 浏览
提问于 2025-04-15 13:18

有没有办法让一个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 个回答

4

文档说在非交互模式下,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.")

可以按照 Fooz 先生的描述添加对 IPython 的支持。

5

我对找到的所有方法进行了比较,并做了一个结果表格。看起来最好的方法是这个:

hasattr(sys, 'ps1')

在这里输入图片描述

如果有人有其他可能不同的情况,请留言,我会把它加上。

14

我偶然发现了以下内容,似乎对我很有帮助:

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

撰写回答