Ipython自定义魔术命令:官网实例+保存自定义magic+以函数的形式调用magic

Ipython自动补全异常

    • 前言
    • 准备知识
    • 代码示例
      • 法一:装饰器+函数
      • 法二:类修饰符
    • 最后一步
      • 如何保存自定义magic
      • 以函数的形式调用magic
    • 参考资料

前言

在使用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形式调用

Ipython自定义魔术命令:官网实例+保存自定义magic+以函数的形式调用magic_第1张图片

法二:类修饰符

效果一样。

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自定义魔术命令:官网实例+保存自定义magic+以函数的形式调用magic_第2张图片

最后一步

通过上面的例子,已经了解到魔术命令的定义形式,以及接受到的参数是什么。
但是,如果我们想在ipython中像自如的像%timeit一样使用,还是有点问题。
因为,上面两种方式的注册魔术命令都只是暂时的,重新启动的ipython,自建魔术命令还是得重新输入

如何保存自定义magic

  1. 一种是将定义magic的代码存为.py文件,每次运行iptython的时候,手动导入一遍即可。
    比如:(QY_ipyautorun.py为magic申明定义代码)

from QY_ipyautorun import *

  1. 如果,懒得每次导入,在jupyter notebook中可以定义一个snippets代码段,每次点一下也可以。
  2. 如果点一下也不可以,直接将上面的导入代码,或者直接将定义代码的.py文件,放入.ipython\profile_default\startup目录:
    startup目录下的文件,每次ipython运行之前都会被运行一遍

C:\Users\Administrator\.ipython\profile_default\startup\QY_ipyautorun.py

以函数的形式调用magic

有些时候,在ipythonjupyter notebook中想以函数的形式调用magic,当然即包括自己定义的,也包括系统的命令:

ipy = get_ipython()
# 指定运行魔术命令
ipy.run_line_magic('history', '6 7 3-4')

#
ipy.find_line_magic('history')

参考资料

  • ipython官网IPython reference — IPython 2.4.2-maint documentation
  • ipython的一些高级用法(二) | KevinHuang

你可能感兴趣的:(Jupyter)