在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
网友评论