web-dev-qa-db-ja.com

ipython:ターミナルの幅を設定する方法

ipython terminalを使用していて、列数が多いnumpy.ndarrayを印刷したい場合、行は約80文字で自動的に分割されます(つまり、行の幅は約80文字です)。

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

おそらく、ipythonは私の端末に80列あると想定しています。実際、私の端末の幅は176文字で、全幅を使用したいと思っています。

次のパラメータを変更しようとしましたが、これは効果がありません。

c.PlainTextFormatter.max_width = 160

端末の全幅を使用するようにipythonに指示するにはどうすればよいですか?

Debian Wheezyでipython 1.2.1を使用しています

27
Martin Vegter

コードを少し調べたところ、探している変数は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で変更できます。

20
Dolda2000

あなたはあなたの現在の線幅を見ることができます

numpy.get_printoptions()['linewidth']

そしてそれを設定します

numpy.set_printoptions(linewidth=160)

印字幅を自動設定

端末の幅を自動的に設定したい場合は、Python起動スクリプトを実行することができます。そのため、ファイルを作成します~/.python_startup.pyまたはあなたがそれを呼び出したいもの、これを中に入れて:

# Set the printing width to the current terminal width for NumPy.
#
# Note: if you change the terminal's 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
28
Garrett

ウィンドウサイズが変更されるたびに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の読み込みを必要になるまで遅らせたい場合は、 Post import hooks in Python 3 for a解決。

IPythonを使用していない場合は、上記をPYTHONSTARTUPファイルに入れ、IPython固有の行を削除します。

4
Mark Lodato