Jupyter notebook中自定义支持天软TSl语言的魔术命令

自定义支持TSL的魔术命令

前言

越来越习惯在jupyter notebook中进行数据分析,但是平时也离不开天软TSL,频繁在两者之间切换了切换去也麻烦,在jupyter notebook中自定义支持天软TSL的单元魔术命令。

功能

  • 批量传变量:可以将基础数据类型的变量名,传到天软中,直接使用。
  • 接受变量名:将天软返回结果,去掉返回的状态信息,传回天软变量

使用范例

Jupyter notebook中自定义支持天软TSl语言的魔术命令

核心代码

以下代码命名为QY_ipyautorun.py,放置在ipython自动加载目录C:\Users\Administrator\.ipython\profile_default\startup\下即可。
文件tinysoft.py 见链接二。

 #C:\Users\Administrator\.ipython\profile_default\startup\QY_ipyautorun.py
from IPython.core.magic import register_cell_magic
import getopt
import sys
import datetime
import logging
sys.path.append(r'E:\桌面space\临时数据\python\个人自定义模块')
from tinysoft import ts,VariableFromTsl

import re
pat = re.compile('( -(?![rsg]\s))|([^-\w ])|( \d\w*)|(-[rsg]\s+-)',re.ASCII)
patseq = re.compile("(?<=-[\w]) +| +(?=-[\w])")
patreturn = re.compile("\Areturn (.+?)(?=;)",re.IGNORECASE)

@register_cell_magic
def QY_tsl(parameter_s='', cell=None):
    """
    与天软交互,单元魔术命令,方式`%%tsl`
    可选项:
    无:直接返回调用的结果
    -g a b c: 提取tsl内核变量[暂未实现]
    -s h d g: 传递python变量进入到tsl内核中,只支持基础数据类型
    -r v :返回结果命名为v;
    v :同-r v
    """ 
    parameter_s = parameter_s.strip()
    setparms = []
    getparms = []
    returnparm = None
    if parameter_s=="":
        pass
    elif not(pat.search(" "+parameter_s+" ") is None):
        raise Exception("设置可选项有误!")
    else:
        opt,arg = getopt.getopt(patseq.split(parameter_s),'r:g:s:')
        if not opt:
            if len(arg[0].split())==1:
                returnparm=arg[0]
            else:
                raise Exception("返回变量名重复!")
        for k, v in opt:
            if k in ["-r"]:
                if returnparm is None:
                    returnparm=v
                else:
                    raise Exception("返回变量名重复!")
            elif k in ["-g"]:
                logging.warning("-g 开关暂时不能使用!")
                getparms.extend(v.split())
            elif k in ["-s"]:
                setparms.extend(v.split())
    # 内置系统参数
    sysparm = {'StockID':'SH000001',
          'CurrentDate':datetime.date.today().toordinal()-693594,
          'Cycle':'日线',
          'bRate':0,
          'RateDay':0.}
    setparmsdict = {k:globals()[k] for k in setparms}
    sysparm["setparmsarr"] = setparmsdict
    cell_prefix = """
setparmsarr := sp_g('setparmsarr');
for k, _ in setparmsarr do
begin
    eval(&format('%s := setparmsarr["%:0s"]',k));
end;
"""
#     print(cell_prefix + cell)
    ret = ts.RemoteExecute(cell_prefix + cell,sysparm)
    if ret is None:
        return ret
    
    if returnparm is None:
        return ret
    a,b,c = ret
    globals().update({returnparm:b})
    return a,c
# 防止被automagic监听到
del QY_tsl 

相关链接