2013-03-11 3 views
9

Sto modificando un modulo python che traccia alcuni grafici speciali usando matplotlib.Come verificare che il backend pylab di matplotlib sia in linea?

In questo momento, questo modulo salva tutte le cifre come file.

Vorrei rendere possibile l'importazione del modulo mentre si lavora in un notebook ipython e vedere i risultati "in linea", d'altra parte mi piacerebbe mantenere la funzionalità predefinita di salvare le figure come file quando il modulo è importato in tutti gli altri casi.

Quindi ho bisogno di verificare in qualche modo se il modulo è importato nel notebook ipython e pylab funziona in linea o meno.

Come posso verificare questo?

risposta

12

È possibile controllare il backend matplotlib con:

import matplotlib 
matplotlib.get_backend() 

Per verificare la presenza di linea matplotlib in particolare:

mpl_is_inline = 'inline' in matplotlib.get_backend() 

Si noti che con il notebook IPython, è possibile sempre figure di visualizzazione in linea, indipendentemente dal backend matplotlib attivo, con:

display(fig) 
2

Questo mi ha fatto cercare, e penso di aver trovato una soluzione. Non sono sicuro se questo è in realtà documentata o anche destinato, ma può benissimo funzionare:

get_ipython().config['IPKernelApp']['pylab'] == 'inline' 

get_ipython() sembra essere un metodo definito solo quando si esegue IPython; restituisce quello che presumo sia l'attuale sessione IPython. Quindi, è possibile accedere all'attributo config, che è un dizionario, che include l'elemento 'IPKernelApp'. Quest'ultimo è un dizionario in sé che può contenere una chiave pylab, che può essere la stringa 'inline'.

Non ho provato molto, ma suppongo che la riga di codice sopra valuterà su False se non stai eseguendo pylab inline.

Ancora più importante, genera un KeyError quando non si esegue il notebook o l'opzione pylab, quindi è necessario prenderlo e prendere quell'eccezione sollevata come "no" per l'esecuzione di un notebook con pylab inline.

Infine, get_ipython() può lanciare un NameError e simile al precedente, che ovviamente significa anche che non stai eseguendo IPython.

L'ho provato solo in minima parte, ma importandolo nel mio notebook IPython, e poi nella predefinita cmdline di Python lo mostra come funzionante.

Facci sapere se questo funziona per voi.

+2

questo controllo di configurazione non prenderà i casi in cui il sever notebook non è stato avviato con 'inline' --pylab invece attivato in fase di esecuzione su una base per-notebook con' pylab inline'%. – minrk

8

Che dire provare:

try: 
    cfg = get_ipython().config 
    print('Called by IPython.') 

    # Caution: cfg is an IPython.config.loader.Config 
    if cfg['IPKernelApp']: 
     print('Within IPython QtConsole.') 

     try: 
      if cfg['IPKernelApp']['pylab'] == 'inline': 
       print('inline pylab loaded.') 
      else: 
       print('pylab loaded, but not in inline mode.') 
     except: 
      print('pylab not loaded.') 
    elif cfg['TerminalIPythonApp']: 
     try: 
      if cfg['TerminalIPythonApp']['pylab'] == 'inline': 
       print('inline pylab loaded.') 
      else: 
       print('pylab loaded, but not in inline mode.') 
     except: 
      print('pylab not loaded.') 
except: 
    print('Not called by IPython.')