Какой код я могу использовать, чтобы проверить, работает ли Python в IDLE?

Как и в заголовке. Я хочу написать сценарий, который ведет себя по-разному в зависимости от того, работает ли он в окне консоли или в режиме IDLE. Есть ли объект, который существует только при запуске в режиме бездействия, который я могу проверить? Переменная окружения?

Я использую Python 2.6.5 и 2.7 на Windows.

Редактировать:

Ответы, данные до сих пор, работают. Но я ищу официальный способ сделать это или тот, который не выглядит как взломать. Если кто-то придумает, я приму это как ответ. Иначе через несколько дней я приму самый ранний ответ. Спасибо всем!

5 ответов

Решение

Google нашел этот пост на форуме в 2003 году. С Python 3.1 (для win32) и версией IDLE, с которой он поставляется, len(sys.modules) os 47 в командной строке, но 122 в оболочке IDLE.

Но зачем тебе все равно? Код Tkinter имеет некоторые неудобства при запуске с IDLE (поскольку последний использует сам tkinter), но в остальном я думаю, что я могу с уверенностью предположить, что вам не нужно об этом беспокоиться.

Я бы предпочел сделать:

import sys
print('Running IDLE' if 'idlelib.run' in sys.modules else 'Out of IDLE')

Я предлагаю упаковать весь код в одну функцию (Python 3):

def RunningIntoPythonIDLE():

    import idlelib.PyShell

    def frames(frame = sys._getframe()):
        _frame = frame
        while _frame :
            yield _frame
            _frame = _frame.f_back

    return idlelib.PyShell.main.__code__ in [frame.f_code for frame in frames()]

Таким образом, приложения tkinter могут выполнить свою проверку:

if not RunningIntoPythonIDLE():
    root.mainloop()

Я немного опоздал, но поскольку IDLE заменяет стандартные потоки пользовательскими объектами ( и это задокументировано), их можно проверить, чтобы определить, выполняется ли сценарий в IDLE:

import sys

def in_idle():
    try:
        return sys.stdin.__module__.startswith('idlelib')
    except AttributeError:
        return True

Мое предложение состоит в том, чтобы получить список всех работающих кадров и проверить, будет ли основной метод Idle там.

def frames(frame = sys._getframe()):
    _frame = frame
    while _frame :
        yield _frame
        _frame = _frame.f_back
import idlelib.PyShell
print(idlelib.PyShell.main.func_code in [frame.f_code for frame in frames()])

Функция frames генерирует кадры, работающие в момент ее объявления, так что вы можете проверить, были ли здесь незанятые.

Другие вопросы по тегам