Обработчик сигналов работает в 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)

Он работает в ванильном 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