【问题标题】:Signal handler works in python but not in ipython信号处理程序在 python 中有效,但在 ipython 中无效
【发布时间】:2017-05-13 03:26:42
【问题描述】:

我正在尝试在窗口调整大小事件上使用信号处理程序设置 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)

它在 vanilla python REPL 中工作(使用python -i example.py 测试并稍微调整终端大小)。但是当相同的代码添加到我的启动 ipython 配置中时,它在 ipython 中不起作用,我不明白为什么。

我并没有固定在这个特定的方法上(这正是我迄今为止尝试过的),所以我会更笼统地表达这个问题:

numpy如何在ipython中自动正确填充到终端宽度?

例如,您可以使用print(np.arange(200)) 来检查 numpy 的换行行为。

【问题讨论】:

  • This ipython issue 似乎相关。
  • 您的代码在 IPython 4.2.0 中适用于我,适用于 Python 3.5.1,但不适用于 IPython 5.1.0 和 Python 3.5.2。

标签: python numpy ipython window-resize


【解决方案1】:

the standard fix for printing large arrays without truncation 的启发,我尝试将线宽设置为无穷大。这似乎在 REPL 和 ipython 中都可以正常工作,所以我建议这种解决方法:

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

这并不能解释为什么您的修复程序不适用于 ipython,但如果上面的行没有与任何意外情况混淆,它应该使打印不受调整大小的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2017-05-16
    • 2016-08-10
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多