我正在修改一個使用matplotlib繪製一些特殊圖形的python模塊。如何檢查matplotlib的pylab後端以內聯方式運行?
現在,這個模塊只是將所有數字保存爲文件。
我想使在ipython筆記本上工作時導入模塊成爲可能,另一方面看到結果「內聯」,另一方面,我想保留默認功能,將模塊保存爲文件在所有其他情況下進口。
所以我需要以某種方式檢查模塊是否在ipython筆記本中導入,並且pylab是否在內聯運行。
我該如何檢查?
我正在修改一個使用matplotlib繪製一些特殊圖形的python模塊。如何檢查matplotlib的pylab後端以內聯方式運行?
現在,這個模塊只是將所有數字保存爲文件。
我想使在ipython筆記本上工作時導入模塊成爲可能,另一方面看到結果「內聯」,另一方面,我想保留默認功能,將模塊保存爲文件在所有其他情況下進口。
所以我需要以某種方式檢查模塊是否在ipython筆記本中導入,並且pylab是否在內聯運行。
我該如何檢查?
您可以檢查matplotlib後端有:
import matplotlib
matplotlib.get_backend()
要檢查特別直列matplotlib:
mpl_is_inline = 'inline' in matplotlib.get_backend()
注意與IPython的筆記本,可以總是顯示內嵌的數字,不管有效的matplotlib後端,與:
display(fig)
這讓我搜索,我想我找到了一個解決方案。不知道這實際上是記錄在案,甚至預期,但它很可能工作:
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上顯示它可以正常工作。
讓我們知道這是否適合你。
什麼努力:
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.')
這個配置檢查不會趕上在筆記本電腦服務器未啓動與'--pylab inline'在運行時激活,而不是在每個筆記本的基礎上與'%pylab inline'情況。 – minrk 2013-03-11 19:28:30