我可以使用什么代码来检查Python是否在IDLE中运行?

时间:2010-08-07 18:13:36

标签: python python-idle

正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口内运行还是在IDLE中运行。是否存在仅在IDLE中运行时才能检查的对象?环境变量?

我在Windows上使用Python 2.6.5和2.7。

编辑:

到目前为止给出的答案有效。但我正在寻找一种正式的方法,或者看起来不像黑客。如果有人想出一个,我会接受这个答案。否则,在几天之内,我会接受最早的答案。谢谢大家!

5 个答案:

答案 0 :(得分:11)

我更愿意这样做:

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

答案 1 :(得分:5)

Google从2003年发现了this论坛帖子。使用Python 3.1(适用于win32)及其附带的IDLE版本,命令行中的len(sys.modules)os 47,但IDLE shell中的122

但你为什么还需要关心呢?使用IDLE运行时,Tkinter代码会有一些烦恼(因为后者使用tkinter本身),但我认为我可以安全地假设您不必关心。

答案 2 :(得分:5)

我建议将所有代码打包在一个函数中(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()

答案 3 :(得分:1)

我的建议是获取所有正在运行的帧的列表,并检查主空闲方法是否在那里。

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()])

frame函数生成在声明时刻运行的帧,因此您可以检查空闲是否在这里。

答案 4 :(得分:1)

我迟到了,但是由于IDLE用自定义对象(and that is documented)替换了标准流,因此可以检查这些流以确定脚本是否在IDLE中运行:

import sys

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