Подтвердить что ты не робот

Ipython: как установить ширину терминала

Когда я использую ipython terminal и хочу напечатать numpy.ndarray, который имеет много столбцов, строки автоматически разбиваются где-то около 80 символов (т.е. ширина строк составляет примерно 80 символов):

z = zeros((2,20))
print z

Предположительно, ipython ожидает, что мой терминал имеет 80 столбцов. На самом деле, мой терминал имеет ширину 176 символов, и я хотел бы использовать полную ширину.

Я попытался изменить следующий параметр, но это не влияет:

c.PlainTextFormatter.max_width = 160

Как я могу сказать ipython использовать полную ширину моего терминала?

Я использую ipython 1.2.1 в Debian Wheezy

4b9b3361

Ответ 1

После некоторого копания кода, кажется, что переменная, которую вы ищете, numpy.core.arrayprint._line_width, по умолчанию 75. Установка для меня 160 работала для меня:

>>> numpy.zeros((2, 20))
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

Функция, используемая по умолчанию для форматирования массива, numpy.core.numeric.array_repr, хотя вы можете изменить ее с помощью numpy.core.numeric.set_string_function.

Ответ 2

Вы можете видеть свою текущую ширину строки с помощью

numpy.get_printoptions()['linewidth']

и установите его с помощью

numpy.set_printoptions(linewidth=160)

Автоматическая установка ширины печати

Если вы хотите, чтобы ширина терминала была установлена ​​автоматически, вы можете запустить Python при запуске script. Поэтому создайте файл ~/.python_startup.py или все, что вы хотите назвать, с этим внутри него:

# Set the printing width to the current terminal width for NumPy.
#
# Note: if you change the terminal width after starting Python,
#       it will not update the printing width.
from os import getenv
terminal_width = getenv('COLUMNS')
try:
    terminal_width = int(terminal_width)
except (ValueError, TypeError):
    print('Sorry, I was unable to read your COLUMNS environment variable')
    terminal_width = None

if terminal_width is not None and terminal_width > 0:
    from numpy import set_printoptions
    set_printoptions(linewidth = terminal_width)

del terminal_width

и чтобы Python выполнял это каждый раз, откройте свой ~/.bashrc файл и добавьте

# Instruct Python to execute a start up script
export PYTHONSTARTUP=$HOME/.python_startup.py
# Ensure that the startup script will be able to access COLUMNS
export COLUMNS

Ответ 3

Чтобы автоматически изменять размер как numpy, так и IPython при каждом изменении размера окна, добавьте следующее в ipython_config.py:

import IPython
import signal
import shutil
import sys
try:
    import numpy as np
except ImportError:
    pass

c = get_config()

def update_terminal_width(*ignored):
    """Resize the IPython and numpy printing width to match the terminal."""
    w, h = shutil.get_terminal_size()

    config = IPython.get_ipython().config
    config.PlainTextFormatter.max_width = w - 1
    shell = IPython.core.interactiveshell.InteractiveShell.instance()
    shell.init_display_formatter()

    if 'numpy' in sys.modules:
        import numpy as np
        np.set_printoptions(linewidth=w - 5)

# We need to configure IPython here differently because get_ipython() does not
# yet exist.
w, h = shutil.get_terminal_size()
c.PlainTextFormatter.max_width = w - 1
if 'numpy' in sys.modules:
    import numpy as np
    np.set_printoptions(linewidth=w - 5)

signal.signal(signal.SIGWINCH, update_terminal_width)

Если вы хотите отложить загрузку numpy до тех пор, пока не будете нужны, посмотрите на Захват импорта импорта в Python 3 для решения.

Если вы не используете IPython, поместите вышеуказанное в свой файл PYTHONSTARTUP и удалите специфические для IPython строки.