前言
越来越习惯在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