Какой код я могу использовать, чтобы проверить, работает ли 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 генерирует кадры, работающие в момент ее объявления, так что вы можете проверить, были ли здесь незанятые.