2013-03-11 5 views
9

Ich modifiziere ein Python-Modul, das einige spezielle Graphen mit Matplotlib plottet.Wie überprüft man, dass das pylab-Backend von matplotlib inline läuft?

Im Moment speichert dieses Modul nur alle Zahlen als Dateien.

Ich möchte es ermöglichen, das Modul während der Arbeit in Ipython Notebook importieren und sehen Sie die Ergebnisse "Inline", auf der anderen Seite möchte ich die Standardfunktionalität der Speicherung der Zahlen als Dateien beibehalten, wenn das Modul ist in allen anderen Fällen importiert.

So muss ich irgendwie überprüfen, ob das Modul in ipython Notebook importiert wird und das pylab arbeitet inline oder nicht.

Wie kann ich das überprüfen?

Antwort

12

Sie können die matplotlib Backend überprüfen:

import matplotlib 
matplotlib.get_backend() 

insbesondere für Inline-matplotlib Um zu überprüfen:

mpl_is_inline = 'inline' in matplotlib.get_backend() 

Beachten Sie, dass mit dem IPython Notebook können Sie immer Anzeige Inline-Figuren, unabhängig vom aktiven Matplotlib-Backend, mit:

display(fig) 
2

Das hat mich auf der Suche, und ich denke, ich habe eine Lösung gefunden. Nicht sicher, ob dies tatsächlich dokumentiert ist oder sogar beabsichtigt, aber es kann sehr gut funktionieren:

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

get_ipython() erscheint eine Methode, um nur definiert, wenn IPython läuft; es gibt zurück, was ich annimmt, ist die aktuelle IPython-Sitzung. Dann können Sie auf das Attribut config zugreifen, das ein Wörterbuch ist, das das Element 'IPKernelApp' enthält. Letzteres ist ein Wörterbuch für sich, das einen Schlüssel pylab enthalten kann, der die Zeichenfolge 'inline' sein kann.

Ich habe nicht ausgiebig versucht, aber ich vermute, dass die obige Codezeile zu False ausgewertet wird, wenn Sie nicht pylab inline ausführen.

Noch wichtiger ist, wird es einen KeyError auslösen, wenn Sie nicht das Notebook oder die pylab-Option ausführen, so müssen Sie diese abfangen und diese Ausnahme als "Nein" für ein Notebook mit pylab inline ausführen.

Schließlich kann get_ipython() eine NameError werfen, und ähnlich wie oben, das bedeutet natürlich auch, dass Sie nicht IPython ausführen.

Ich habe dies nur minimal getestet, aber importiere dies in meinem IPython-Notebook, und dann auf der Standard-Python-cmdline zeigt es funktioniert.

Lassen Sie uns wissen, ob dies für Sie funktioniert.

+2

diese Konfigurationsprüfung nicht Fälle fangen, wo das Notebook Sever nicht mit '--pylab inline' gestartet wurde, statt zur Laufzeit auf einer Basis pro-Notebook aktiviert mit'% pylab inline'. – minrk

8

Was zu versuchen:

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