信号处理程序在 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 不起作用,但如果上面的行没有出现任何意外情况,它应该可以使打印不受调整大小影响。
我试图在 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 不起作用,但如果上面的行没有出现任何意外情况,它应该可以使打印不受调整大小影响。