2013-09-10 1 views
3

Некоторое время назад я переключился с старого EPD Enthoughtht на их новую систему Canopy. По большей части это приятно, но один аспект был особенно досадным.Enthought Canopy не печатает сразу, когда выдается сообщение

Всякий раз, когда я запускаю сценарий python, либо из среды Canopy iPython, либо из командной строки, ни один из моих операторов print фактически не печатается сразу, когда эта часть скрипта попадает. Вместо этого несколько print s кажутся выполненными сразу же позже.

В качестве примера ...

import numpy as np 

print "About to start long computation..." 
a = np.random.randn(1e8) 
print "Computation finished." 

не печатает первое заявление до послеa не закончен генерируется, когда оба высказывания печатаются одновременно. (Вы можете узнать, когда вычисление происходит при просмотре монитора ЦП.)

Кто-нибудь знает, что здесь происходит? Если это уместно, я запускаю Canopy 1.0.0.1160, с Python 2.7.3 64bit на компьютере с Windows 7.

+0

В случае, если это не было ясно, я никогда не имел эту проблему со старой EPD. – Blas

+3

Просто, чтобы сузить, где проблема: если вы выполняете 'import sys', а затем вызываете' sys.stdout.flush() 'после инструкции print, она появляется сразу? – Dougal

+0

Это действительно так. Это как-то должно быть проблемой, но есть ли способ заставить флеш после каждого 'print', и почему это не происходит автоматически с Canopy, как это происходит с каждым другим дистрибутивом python? – Blas

ответ

2

Нет, это не изменение между EPD и Дождя. Хотя я полагаю, что могут быть некоторые дистрибутивы python, которые по умолчанию отбрасывают буферизацию, EPD не был одним из них - поражение производительности могло быть слишком серьезным (как замечает замечание kindall). Лучше позволить программисту решить, когда это важно для пользователя для немедленного отображения вывода консоли (обычно для обновлений состояния).

BTW, IPython в GUI Canopy - это просто IPython QtConsole. Если вы зависите от ввода-вывода консоли, вам также может быть необходимо знать эту давнюю проблему с QtConsole:

Я не думаю, что существует разумное обходное решение для Canopy IPython, отличное от «правильно», т.е. с флешем.

https://support.enthought.com/entries/22157050-Canopy-Python-prompt-QtConsole-Can-t-run-interactive-OS-shell-commands

+0

Спасибо Джонатан. Для всех, кто пришел позже, я просто наложил псевдоним 'python' на' python -u' для скриптов, запускаемых из командной строки; еще не решили, стоит ли заставлять Навеса делать то же самое. Я мог бы поклясться, что это никогда не было проблемой с EPD, хотя ... – Blas

2

Это похоже на буферизованный выход. Попробуйте запустить сценарий как:

python -u yourscript 

Флаг -u поворачивает буферизацию прочь.

(Заменить python от имени вашей ОС Python исполняемого.)