Обработчикът на сигнали работи в python, но не и в ipython

Опитвам се да задам опциите за печат на numpy, като използвам манипулатор на сигнали в събитието за преоразмеряване на прозореца. Не искате да правите връзка, докато numpy не бъде импортиран, и не искате да импортирате numpy автоматично при стартиране на python. Разбрах, че почти работи с кода по-долу:

# 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)

Работи във vanilla python REPL (тествайте с python -i example.py и преоразмерете малко терминала). Но не работи в ipython, когато същият код се добави към моята стартираща ipython конфигурация и не разбирам защо.

Не съм прикован към този конкретен подход (само това съм опитвал досега), така че ще формулирам въпроса по-общо:

Как numpy може правилно да запълни автоматично ширината на терминала в ipython?

Можете да използвате print(np.arange(200)), например, за да проверите поведението на numpy при обвиване на ред.


person wim    schedule 28.12.2016    source източник
comment
Този проблем с ipython изглежда уместен.   -  person Andras Deak    schedule 29.12.2016
comment
Вашият код работи за мен в IPython 4.2.0, с Python 3.5.1, но не и с IPython 5.1.0 и Python 3.5.2.   -  person Nick Matteo    schedule 29.12.2016


Отговори (1)


Вдъхновен от стандартната корекция за отпечатване на големи масиви без отрязване, опитах да задам ширината на линията до безкрайност. Това изглежда работи добре както в REPL, така и в ipython, така че предлагам това решение:

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

Това не обяснява защо корекцията ви не работи за ipython, но в случай че горният ред не се забърква с нещо неочаквано, трябва да направи печатането имунизирано срещу преоразмеряване.

person Andras Deak    schedule 28.12.2016