正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口内运行还是在IDLE中运行。是否存在仅在IDLE中运行时才能检查的对象?环境变量?
我在Windows上使用Python 2.6.5和2.7。
到目前为止给出的答案有效。但我正在寻找一种正式的方法,或者看起来不像黑客。如果有人想出一个,我会接受这个答案。否则,在几天之内,我会接受最早的答案。谢谢大家!
答案 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