程序员

Jupyterhub的notebook中自定义魔法命令

2020-07-16  本文已影响0人  北邮郭大宝

在Jupyterhub的notebook中,可能会用到一些魔法命令简化操作。通过%lsmagic可以查看所有注册的命令


1594732812712.jpg

此外更常用的是需要自定义一些魔法命令,以便更好的与自己的项目结合。

官网中提供了通过装饰器+函数的方式自定义魔术命令的方式,我这里举个demo,自定义%locate命令,实现调用百度API查询经纬度的需求。

功能目标:在jupyterhub的notebook中自定义locate命令,并通过%locate <path> 返回path路径下文档中地点的坐标。

首先编写utils.py,实现基本的功能,通过调用百度API返回坐标。

import json
import requests
from IPython.core.magic import register_line_magic


@register_line_magic
def locate(path):
    with open(path, 'r') as f:
      for line in f.readlines():
        address = line.strip()
        url = get_url(address)
        print(get_position(url))


def get_url(address):
  ak = 'XXXXXXXXXXX'  # ak是在百度地图API秘钥
  return f'http://api.map.baidu.com/geocoding/v3/?address={address}&output=json&ak={ak}'

def get_position(url):
  res = requests.get(url)
  data = json.loads(res.text)
  if data['status'] == 0:
    lng = data['result']['location']['lng']
    lat = data['result']['location']['lat']
  else:
    return None
  return lng,lat

为了能每次启动notebook都让命令生效,目前还没找到在jupyterhub中比较好的办法,如果是Ipython中可以把脚本保存在.ipython\profile_default\startup\

目前临时的解决办法是先写一个脚本scrip.py。

from utils import *

通过Dockerfile打包到singleruser的镜像里,看起来像这样

COPY utils /home/jovyan/utils
1594906416316.jpg

准备测试数据,在/work/data.txt里填写地点

1594906390579.jpg

每次使用前先执行脚本,然后就可以通过%locate <path>执行自定义的命令

1594906242613.jpg
上一篇下一篇

猜你喜欢

热点阅读