2013-03-11 54 views
9

我正在修改一個使用matplotlib繪製一些特殊圖形的python模塊。如何檢查matplotlib的pylab後端以內聯方式運行?

現在,這個模塊只是將所有數字保存爲文件。

我想使在ipython筆記本上工作時導入模塊成爲可能,另一方面看到結果「內聯」,另一方面,我想保留默認功能,將模塊保存爲文件在所有其他情況下進口。

所以我需要以某種方式檢查模塊是否在ipython筆記本中導入,並且pylab是否在內聯運行。

我該如何檢查?

回答

12

您可以檢查matplotlib後端有:

import matplotlib 
matplotlib.get_backend() 

要檢查特別直列matplotlib:

mpl_is_inline = 'inline' in matplotlib.get_backend() 

注意與IPython的筆記本,可以總是顯示內嵌的數字,不管有效的matplotlib後端,與:

display(fig) 
2

這讓我搜索,我想我找到了一個解決方案。不知道這實際上是記錄在案,甚至預期,但它很可能工作:

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

get_ipython()似乎是運行IPython的時候只定義的方法;它返回我認爲當前的IPython會話。然後,您可以訪問config屬性,該屬性是一個包含'IPKernelApp'元素的字典。後者本身是一本字典,可以包含一個密鑰pylab,可以是字符串'inline'

我還沒有廣泛嘗試,但我猜測如果你不運行pylab內聯,上面的代碼行將評估爲False。

更重要的是,當你沒有運行筆記本或pylab選項時,它會引發KeyError,因此你需要捕獲該異常,並用pylab內聯運行帶有「no」的筆記本。

最後,get_ipython()可能會拋出一個NameError,和上面類似,這當然也意味着你沒有運行IPython。

我只測試過這麼簡單,但是在我的IPython筆記本中導入這個,然後在默認的Python cmdline上顯示它可以正常工作。

讓我們知道這是否適合你。

+2

這個配置檢查不會趕上在筆記本電腦服務器未啓動與'--pylab inline'在運行時激活,而不是在每個筆記本的基礎上與'%pylab inline'情況。 – minrk 2013-03-11 19:28:30

8

什麼努力:

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.') 
相關問題