为什么python控制台运行不同于空闲

时间:2017-09-30 06:01:08

标签: python python-3.x debugging

有谁能告诉我为什么这个代码在python控制台中的运行方式与IDLE不同?

print('Do not press enter before the program says go.\n', end = '')
try:
    while True:
        input('Ready?')
        print('Starting', end = '')
        for i in range(secrets.randbits(3)):
            time.sleep(1)
            print(' .', end = '')
        now = datetime.datetime.now()
        input('\nGo!')
        print('\nReaction: {}'.format(datetime.datetime.now()-now))
except KeyboardInterrupt:
    print('Exiting.')

这是IDLE中的输出,它按照我期望的方式工作:

Do not press enter before the program says go.
Ready?
Starting . .
Go!

Reaction: 0:00:00.328174

但是当在控制台中我得到相同的整体输出但是点不会一个接一个地出现,而是它们一起出现在go.Can任何人解释这种奇怪的行为。如果有帮助,我正在运行Python 3.6.2。

我确实有办法测试程序是否从IDLE运行,如果处于空闲状态则返回true,如果不处于空闲状态则返回false:

def inIDLE():
    import sys
    if 'idlelib.run' in sys.modules:
        return True
    else:
        return False

1 个答案:

答案 0 :(得分:1)

因为它是一个GUI程序(在Tkinter上运行),IDLE有一些怪癖;普通控制台实际上表现正常,因为输出到stdout通常是行缓冲的。

如果您不希望您的点一下子出现,您可以告诉控制台清空其输出:

print(' .', end = '', flush=True)

或者,您可以打印到通常未缓冲的stderr

import sys
#...
print(' .', end = '', file=sys.stderr)

在控制台中,您可以通过将stdout选项传递给解释器来选择无缓冲的-u,有关详细信息,请参阅python3 -h