7

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

4 回答 4

13

我偶然发现了以下内容,它似乎对我有用:

def in_ipython():
    try:
        return __IPYTHON__
    except NameError:
        return False
于 2009-07-31T14:37:48.667 回答
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.")

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

于 2011-07-13T07:44:04.310 回答
2

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

于 2009-07-31T14:21:01.503 回答
2

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

hasattr(sys, 'ps1')

在此处输入图像描述

如果有人有其他可能不同的场景,请发表评论,我会添加它

于 2020-10-25T12:54:51.213 回答