Обнаружение, когда сценарий python выполняется в интерактивном режиме в ipython

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Есть ли способ для сценария Python автоматически определять, выполняется ли он в интерактивном режиме или нет? Кроме того, можно ли определить, используется ли ipython по сравнению с обычным исполняемым файлом на языке 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)
Это было полезно?

Решение

Я наткнулся на следующее, и мне кажется, это помогает:

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

Другие советы

В документах говорится, что 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.")

Поддержка IPython может быть добавлена, как описано г-ном Фузом.

При интерактивном запуске python запускает сценарий в $ PYTHONSTARTUP, поэтому вы можете просто заставить эту переменную окружения вызывать сценарий, который устанавливает глобальный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top