2014-08-30 31 views
21

Gdy używam ipython terminal i chcesz wydrukować numpy.ndarray który ma wiele kolumn, linie są automatycznie uszkodzony gdzieś około 80 znaków (czyli szerokość linii jest cca 80 znaków):ipython: Jak ustawić szerokość terminala

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

Przypuszczalnie ipython oczekuje, że mój terminal ma 80 kolumn. W rzeczywistości jednak mój terminal ma szerokość 176 znaków i chciałbym użyć pełnej szerokości.

Próbowałem zmienić następujący parametr, ale nie ma to wpływu:

c.PlainTextFormatter.max_width = 160 

Jak mogę ipython używać pełnej szerokości mojego terminala?

Używam ipython 1.2.1 na Debian wheezy

+2

Nawiasem mówiąc, nie jest to zależne od iPythona, więc możesz chcieć zaktualizować tagi, aby to odzwierciedlić. Zachowanie jest specyficzne dla 'numpy' i jest takie samo bez względu na to, czy używasz iPython, czy jakiegokolwiek innego interpretera Pythona. – Dolda2000

+0

możliwy duplikat [Rozwiń szerokość powłoki w IDLE Pythona] (http://stackoverflow.com/questions/7770614/expand-width-of-shell-in-pythons-idle) – simonzack

Odpowiedz

17

po pewnym kopanie poprzez kod, wydaje się, że zmienna szukasz jest numpy.core.arrayprint._line_width, który jest 75 domyślnie. Ustawienie go do 160 pracował dla mnie:

>>> 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.]]) 

Funkcja domyślnie używany do formatowania tablicy jest numpy.core.numeric.array_repr, chociaż można to zmienić z numpy.core.numeric.set_string_function.

+0

nie ma "numpy.core.arrayprint ._line_width' w moim '$ HOME/.config/ipython/profile_default/ipython_config.py'. Czy powinienem po prostu napisać tam linię, czy też 'numpy' ma swój własny plik konfiguracyjny gdzieś indziej? –

+0

@MartinVegter: Nie mówię o plikach konfiguracyjnych i wątpię, żeby 'numpy' miał nawet jeden. Jest to zwykła zmienna Pythona i można ją ustawić po prostu wykonując 'numpy.core.arrayprint._line_width = 160' po zaimportowaniu numpy. Jeśli chcesz jakoś to uczynić domyślnym, obawiam się, że nie mogę ci pomóc, ponieważ nie wiem, w jaki sposób iPython wykonuje sekwencję startową i jakie pliki rc może lub może nie działać. W zależności od konfiguracji, możesz rozważyć proste edytowanie źródła 'numpy' bezpośrednio. – Dolda2000

+0

Jeśli wspomniany "$ HOME/.config/ipython/profile_default/ipython_config.py", o którym wspomniałeś, jest plikiem Pythona, który iPython wykonuje po uruchomieniu, możesz rozważyć wprowadzenie 'import numpy', a następnie' numpy.core. arrayprint._line_width = 160' w nim. – Dolda2000

20

można zobaczyć aktualną szerokość linii z

numpy.get_printoptions()['linewidth'] 

i ustawić ją z

numpy.set_printoptions(linewidth=160) 

Automatycznie ustawić szerokość drukowania

Jeśli chcesz szerokość terminala należy ustawić automatycznie , możesz mieć Pythona do uruchamiania skryptu startowego. Więc utworzyć plik ~/.python_startup.py lub cokolwiek chcesz to nazwać, z tym środku:

# 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 

i mieć Python wykonać to za każdym razem, otworzyć plik ~/.bashrc i dodać

# 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 
2

Aby automatycznie rozmiaru zarówno numpy i ipython gdy zmiany rozmiaru okna, należy dodać następujące wpisy do 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) 

Jeśli chcesz d elfa ładuje numpy, dopóki nie jest konieczne, spójrz na Post import hooks in Python 3 dla rozwiązania.

Jeśli nie używasz IPython, umieść powyższe w pliku PYTHONSTARTUP i usuń linie specyficzne dla IPython.

+0

Jaki jest obiekt 'c'? – wim

+0

@wim dziękuję za wskazanie tego. Naprawiono (jest to 'get_config()'). –

Powiązane problemy