前言
在使用jupyter notebook
的過程中,經常有些代碼,有些需求是可重用的,這當然可以使用snippets
代碼段插件解決,但是不夠python
。每次見到一堆重複的代碼,特別是需要自定義一些參數的時候,甚是有點嫌棄。因此,找些資料,嘗試自定義自己的魔術命令。
準備知識
魔術命令的分類
- 行(line)魔術命令,形如:
%run
/%timeit
,參數(若有)都在一行。 - 單元格(cell)魔術命令,形如:
%%javascript
/%%timeit
,參數爲整個單元格,分爲在魔術命令同行傳入的可選項,單元格餘下部分的cell body
。 - 可以注意到,這裏的
timeit
即可以是行魔術命令,也可以是單元格命令。
代碼示例
官網中提供了兩種自定義魔術命令的模版,親測效果都一樣。
法一:裝飾器+函數
在jupyter notebook
中建一單元格,輸入以下代碼即可。
from IPython.core.magic import (register_line_magic, register_cell_magic,
register_line_cell_magic,)
@register_line_magic # 行魔術命令
def lmagic(line):
"my line magic"
return line
@register_cell_magic # 單元魔術命令,line爲首行輸入的可選項
def cmagic(line, cell):
"my cell magic"
return line, cell
@register_line_cell_magic #混搭
def lcmagic(line, cell=None):
"Magic that works both as %lcmagic and as %%lcmagic"
if cell is None:
print("Called as line magic")
return line
else:
print("Called as cell magic")
return line, cell
del lmagic,cmagic,lcmagic # 防止被automagic採集到,使得只能 %lmagic形式調用
法二:類修飾符
效果一樣。
from __future__ import print_function
from IPython.core.magic import (Magics, magics_class, line_magic,
cell_magic, line_cell_magic)
@magics_class
class MyMagics(Magics):
@line_magic
def lmagic(self, line): # 行魔術命令
"my line magic"
print("Full access to the main IPython object:", self.shell) # 可以控制整個ipython內核
# #整個命名空間的變量
# #同在ipython中的get_ipython().kernel.shell.user_ns.keys()==get_ipython().user_ns.keys()
# print("Variables in the user namespace:", list(self.shell.user_ns.keys()))
return line
@cell_magic
def cmagic(self, line, cell):
"my cell magic"
return line, cell
@line_cell_magic
def lcmagic(self, line, cell=None):
"Magic that works both as %lcmagic and as %%lcmagic"
if cell is None:
print("Called as line magic")
return line
else:
print("Called as cell magic")
return line, cell
# 註冊魔術命令
ip = get_ipython()
ip.register_magics(MyMagics)
最後一步
通過上面的例子,已經瞭解到魔術命令的定義形式,以及接受到的參數是什麼。
但是,如果我們想在ipython中像自如的像%timeit
一樣使用,還是有點問題。
因爲,上面兩種方式的註冊魔術命令都只是暫時的,重新啓動的ipython,自建魔術命令還是得重新輸入。
如何保存自定義magic
- 一種是將定義magic的代碼存爲
.py
文件,每次運行iptython
的時候,手動導入一遍即可。
比如:(QY_ipyautorun.py
爲magic申明定義代碼)
from QY_ipyautorun import *
- 如果,懶得每次導入,在
jupyter notebook
中可以定義一個snippets
代碼段,每次點一下也可以。 - 如果點一下也不可以,直接將上面的導入代碼,或者直接將定義代碼的
.py
文件,放入.ipython\profile_default\startup
目錄:
startup目錄下的文件,每次ipython運行之前都會被運行一遍
C:\Users\Administrator\.ipython\profile_default\startup\QY_ipyautorun.py
以函數的形式調用magic
有些時候,在ipython
或jupyter notebook
中想以函數的形式調用magic,當然即包括自己定義的,也包括系統的命令:
ipy = get_ipython()
# 指定運行魔術命令
ipy.run_line_magic('history', '6 7 3-4')
#
ipy.find_line_magic('history')