Detectar quando um script python está sendo executado de forma interativa em ipython

StackOverflow https://stackoverflow.com/questions/1212779

  •  06-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira para um script python para automaticamente detectar se ele está sendo executado de forma interativa ou não? Alternativamente, pode-se detectar se ipython está sendo usado contra o executável regulares c python?

Fundo: Meus scripts python geralmente têm uma chamada para exit () neles. De vez em quando, eu executar os scripts de forma interativa para depuração e profiling, geralmente em ipython. Quando eu estou correndo de forma interativa, eu quero suprimir as chamadas para sair.

Clarificação :

Suponha que eu tenho um script, myscript.py, que se parece com:

#!/usr/bin/python
...do useful stuff...
exit(exit_status)

Às vezes, eu quero executar o script em uma sessão IPython que eu já começaram, dizendo algo como:

In [nnn]: %run -p -D myscript.pstats myscript.py

No final do script, a chamada exit () fará com que ipython para pendurar enquanto ele me pergunta se eu realmente quero sair. Este é um aborrecimento menor durante a depuração (demasiado pequena para mim para cuidar), mas pode atrapalhar resultados de perfil: o aviso de saída é incluído nos resultados de perfil (tornando a análise mais difícil se eu iniciar uma sessão de criação de perfil antes de ir para almoço) .

O que eu gostaria é algo que me permite modificar o meu script para que ele se parece com:

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

Solução

Eu tropecei na seguinte e parece fazer o truque para mim:

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

Outras dicas

Docs dizer que sys.ps1 não existe no modo não-interativo. Além disso, pode-se usar sys.flags (para Python 2.6+) para detectar se temos usado python -i <whatever>.

Este script detecta se corremos de forma interativa, não interativa, e no modo pós-mortem (que pode ser atribuído ao modo interativo se interpretador Python é chamado usando python -i implicitamente eo usuário acha que ele desembarcou no console "interativa"):

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

Suporte IPython pode ser adicionado como descrito pelo Sr. Fooz.

Quando invocado de forma interativa, python irá executar o script em $ PYTHONSTARTUP, então você poderia simplesmente ter essa variável de ambiente invocar um script que define uma abordagem global

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top