FAQ > 金融建模 > 第三方交互 > Python

Q:python中如何在交互时自动连接天软服务器,且不产生多余的登陆数    

【简述】场景说明:在python程序中,频繁且长时与天软交互时,中间可能由于一些原因使得连接发生中断,或在登陆连接时失败,而后再做交互时引发报错,使程序中断。
那么,如何在这个交互过程中,即便连接中断也能再次自动连接,让程序更顺利地运行下去?
  • A:针对python程序中用远程的方式与天软频繁交互可能由于连接失败导致程序的中断问题,这里提供一种较为合理的解决方案:
    封装tslconnect模块,重新对天软的连接及交互接口进行封装。
    调用时,只需要导入tslconnect模块,即可在python的任何地方直接做交互,不用再考虑连接问题。
    在连接失败时,会多次尝试自动连接,避免某一时刻的不稳定连接造成程序的中断。
    PS:只需在python程序结束时,再做连接的断开操作,避免频繁登陆退出天软服务器,提高交互效率及连接的稳定性。

    本方案供有需要的用户参考,具体实现及使用说明如下:
    解决方案的要点:
    1、将连接服务器的过程进行独立封装,当第一次请求连接不成功时,停个几秒(时间用户可以改)再尝试连接,直到连接成功为止,除非尝试10次(次数可以用户定义)都不成功时,再进行报错提示。
      即,tslconnect替代原登陆模型。

    2、在执行交互时判断当前是否已连接,若没有连接,则先做连接请求,再交互,提前解决掉连接已断开还在请求交互的情况。
       即,对原交互函数RemoteExecute与RemoteCallFunc再封装一层,用tslRemoteExecute与tslRemoteCallFunc替代。

    配置:
    1、下载已封装好的tslconnect.py文件,附件:附件:tslconnect.py
    2、打开tslconnect.py文件,在对应的位置填入用户本机电脑中的天软根目录路径,天软账号及密码
    分别对应变量:path、userid、password,位置如下:

    设置好之后,保存即可。

    tslconnect模块说明
    天软交互说明:FAQ:2019-05-08-应用专题-第三方交互07:天软平台和PYTHON的交互
    根据天软已有的功能模型进行重新封装,模块中含以下接口:
     1.tslconnect() 
       说明:连接天软服务器,若当前已有连接,则返回0,否则进行连接服务器操作,若连接失败,则会尝试再试连接,直到连接成功为止,尝试10次都失败,则返回报错信息。
       返回:连接成功时,返回0,不成功时返回报错信息。

     2.tslRemoteExecute 调用天软语句,用法与原接口RemoteExecute保持不变
     3.tslRemoteCallFunc 调用天软函数,用法与原接口RemoteCallFunc保持不变 
      在原模块的基础上新增自动登录天软服务器的功能,其逻辑是:
      在执行交互前,先调用tslconnect()再执行RemoteExecute或RemoteCallFunc。
      即,在执行天软交互时,先自动连接并保证当前是已连接的状态后再执行天软语句或函数。

     4.tslDisConnect() 主动断开连接,用法与功能同原模块的Disconnect,在多个任务完成调用天软后,可调用一次该函数对连接进行断开。


    使用范例:在python程序中,多次调用天软的应用
    python代码:

    #导入tslconnect模块
    import tslconnect as tsl
    #直接调用tslRemoteExecute或tslRemoteCallFunc做交互操作,不用关注连接操作
    data1=tsl.tslRemoteExecute("return 'login success';",{})
    print(data1)
    data2=tsl.tslRemoteCallFunc("stockName",['SZ000002'],{})
    print(data2[1].decode("gbk"))
    #取个股的行情数据
    stockid='SH600000'
    begt=20190701
    endt=20190710
    ts_str=""" StockId:='%s';
    begt:=%dT;
    ENDT:=%dT;
    setsysparam(PN_Cycle(),cy_day());
    return select ['StockID'],datetostr(['date']) as 'date',['close'] from markettable
    datekey Begt to Endt+0.99999 of StockId end;
    """%(stockid,begt,endt)
    data3=tsl.tslRemoteExecute(ts_str,{})
    print(data3)
    #程序结束前,断开与天软的连接,避免账号的占用
    tsl.tslDisConnect()

    执行结果: