正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口内还是在 IDLE 中运行。是否存在仅在我可以检查的 IDLE 中运行时才存在的对象?环境变量?
我在 Windows 上使用 Python 2.6.5 和 2.7。
编辑:
到目前为止给出的答案是有效的。但我正在寻找一种正式的方式来做到这一点,或者看起来不像黑客的方式。如果有人想出一个,我会接受它作为答案。否则,几天后,我会接受最早的答案。
正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口内还是在 IDLE 中运行。是否存在仅在我可以检查的 IDLE 中运行时才存在的对象?环境变量?
我在 Windows 上使用 Python 2.6.5 和 2.7。
到目前为止给出的答案是有效的。但我正在寻找一种正式的方式来做到这一点,或者看起来不像黑客的方式。如果有人想出一个,我会接受它作为答案。否则,几天后,我会接受最早的答案。
我更愿意这样做:
import sys
print('Running IDLE' if 'idlelib.run' in sys.modules else 'Out of IDLE')
谷歌从 2003 年找到我这个论坛帖子。使用 Python 3.1(用于 win32)和它附带的 IDLE 版本,命令行中的 len(sys.modules) os 47 但 IDLE shell 中的 122。
但你为什么还需要关心呢?Tkinter 代码在使用 IDLE 运行时会有些烦恼(因为后者使用 tkinter 本身),但否则我认为我可以安全地假设您不必关心。
我建议将所有代码打包在一个函数中(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
我的建议是获取所有正在运行的帧的列表并检查主要空闲方法是否存在。
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 函数在其声明时生成正在运行的帧,因此您可以检查此处是否空闲。