Ipython自动补全异常
前言
在使用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')