2016-12-28 10 views
3

Я пытаюсь установить параметры печати numpy с помощью обработчика сигнала в событии изменения размера окна. Не хотите подключаться, пока не будет импортирован numpy, и не хотите автоматически импортировать numpy при запуске python. У меня это почти работает на коде ниже:Обработчик сигналов работает в python, но не в ipython

# example.py 
import wrapt 

@wrapt.when_imported('numpy') 
def post_import_hook(numpy): 
    import signal 
    try: 
     from shutil import get_terminal_size 
    except ImportError: 
     # Python 2 
     from shutil_backports import get_terminal_size 

    def resize_handler(signum=signal.SIGWINCH, frame=None): 
     w, h = get_terminal_size() 
     numpy.set_printoptions(linewidth=w) 
     print('handled window resize {}'.format(w)) 

    resize_handler() 
    signal.signal(signal.SIGWINCH, resize_handler) 

Он работает в ванильном питона РЕПЛ (тест с python -i example.py и размером терминала немного). Но он не работает в ipython, когда тот же код добавляется в мою конфигурацию ipython для запуска, и я не понимаю, почему.

Я не фиксирован на данном подходе (это только то, что я пытался до сих пор), поэтому я фраза вопрос в более общем плане:

Как правильно заполнить Numpy ширине терминала автоматически в ipython?

Например, вы можете использовать print(np.arange(200)), чтобы проверить поведение обертки строки numpy.

+1

[Эта проблема с ipython] (https://github.com/ipython/ipython/issues/8469) представляется актуальной. –

+0

Ваш код работает для меня в IPython 4.2.0, с Python 3.5.1, но не с IPython 5.1.0 и Python 3.5.2. – Kundor

ответ

1

Вдохновленный the standard fix for printing large arrays without truncation, я попытался установить ширину линии на бесконечность. Это, кажется, работает нормально, как в РЕПЛ и в IPython, так что я предлагаю это временное решение:

import numpy 
numpy.set_printoptions(linewidth=numpy.inf) 

Это не объясняет, почему ваши исправления не работает IPython, но и в случае выше линии Безразлично» t беспорядок с чем-то неожиданным, он должен сделать печать невосприимчивой к изменению размера.