检测在ipython中以交互方式运行python脚本的时间

问题描述 投票:7回答:3

有没有办法让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)
python interactive ipython
3个回答
13
投票

我偶然发现了以下内容,它似乎为我做了诀窍:

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

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.")

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.