2014-08-30 3 views
21

Quando uso ipython terminal e si desidera stampare un numpy.ndarray che ha molte colonne, le linee sono rotti automaticamente da qualche parte circa 80 caratteri (cioè la larghezza delle linee è cca 80 caratteri):ipython: come impostare la larghezza del terminale

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

Presumibilmente, ipython si aspetta che il mio terminale abbia 80 colonne. In realtà però, il mio terminale ha una larghezza di 176 caratteri e vorrei usare tutta la larghezza.

Ho provato a cambiare il seguente parametro, ma questo non ha alcun effetto:

c.PlainTextFormatter.max_width = 160 

Come posso dire a ipython di utilizzare tutta la larghezza del mio terminale?

Sto usando ipython 1.2.1 su Debian Wheezy

+2

A proposito, questo non è specifico per iPython, quindi potresti voler aggiornare i tag per riflettere questo. Il comportamento è specifico di 'numpy', ed è lo stesso sia che si usi iPython o qualsiasi altro interprete Python. – Dolda2000

+0

possibile duplicato di [Espandi larghezza della shell in IDLE di Python] (http://stackoverflow.com/questions/7770614/expand-width-of-shell-in-pythons-idle) – simonzack

risposta

17

Dopo un po 'scavare attraverso il codice, sembra che la variabile che stai cercando è numpy.core.arrayprint._line_width, che è 75 per impostazione predefinita. L'impostazione a 160 funzionato per me:

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

La funzione utilizzata per impostazione predefinita per la formattazione array è numpy.core.numeric.array_repr, anche se è possibile cambiare questo con numpy.core.numeric.set_string_function.

+0

non c'è 'numpy.core.arrayprint ._line_width' nel mio '$ HOME/.config/ipython/profile_default/ipython_config.py'. Dovrei semplicemente aggiungere la linea, o 'numpy' ha il proprio file di configurazione da qualche altra parte? –

+0

@ MartinVegter: Non sto parlando di file di configurazione e dubito che 'numpy' ne abbia anche uno. È una normale variabile Python, ed è possibile impostarla semplicemente eseguendo 'numpy.core.arrayprint._line_width = 160' dopo aver importato numpy. Se vuoi in qualche modo renderlo predefinito, allora temo di non poterti aiutare, dato che non so come iPython esegua la sua sequenza di avvio e che tipo di file rc possa o non possa eseguire. A seconda della configurazione, è possibile prendere in considerazione semplicemente la modifica della sorgente di 'numpy' direttamente. – Dolda2000

+0

Se questo '$ HOME/.config/ipython/profile_default/ipython_config.py' che si menziona è un file Python che iPython esegue semplicemente all'avvio, si consiglia di prendere in considerazione solo' import numpy' e poi 'numpy.core. arrayprint._line_width = 160' in esso. – Dolda2000

20

È possibile visualizzare la larghezza della linea corrente con

numpy.get_printoptions()['linewidth'] 

e impostarlo con

numpy.set_printoptions(linewidth=160) 

impostare automaticamente larghezza di stampa

Se vuoi la larghezza del terminale da impostare automaticamente , puoi fare in modo che Python esegua uno script di avvio. Quindi creare un file ~/.python_startup.py o come volete chiamarlo, con questo suo interno:

# 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 

e di avere Python eseguire questo ogni volta, aprire il file ~/.bashrc, e aggiungere

# 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

Per automaticamente ridimensionare sia NumPy e IPython ogni volta che le variazioni nelle dimensioni della finestra, aggiungere il seguente al vostro 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) 

Se si desidera d elay caricando numpy finché necessario, guarda Post import hooks in Python 3 per una soluzione.

Se non si utilizza IPython, inserire quanto sopra nel file PYTHONSTARTUP e rimuovere le linee specifiche di IPython.

+0

Qual è l'oggetto 'c'? – wim

+0

@wim grazie per averlo indicato. Risolto (è 'get_config()'). –