信号处理程序在 python 中有效,但在 ipython 中无效

Signal handler works in python but not in ipython

我试图在 window 调整大小事件中使用信号处理程序设置 numpy 打印选项。在导入 numpy 之前不想建立连接,并且不想在 python 启动时自动导入 numpy。我已经几乎可以使用下面的代码了:

# 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 的换行行为。

受到the standard fix for printing large arrays without truncation的启发,我尝试将线宽设置为无穷大。这似乎在 REPL 和 ipython 中都运行良好,因此我建议采用以下解决方法:

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

这并不能解释为什么您的修复程序对 ipython 不起作用,但如果上面的行没有出现任何意外情况,它应该可以使打印不受调整大小影响。