踩坑小记
同花顺的数据接口iFinD还算好用,但是由于VBA的接口只能在Windows环境下使用,所以本机暂时还只能拿纯python的接口来用,配置各种依赖的过程耗时加起来也有一天一夜了,在过程中踩到的坑也在此予以记录,作为之后安装其他接口的前置经验。
iFinD数据接口
首先对系统进行升级以后,到「同花顺数据接口」下载Linux SDK,下载好后缀为.tar.gz的压缩包以后cd进入下载文件夹,直接使用如下命令语句解压缩:
# tar -xzvf <file.tar.gz> -C <destination_folder>
tar -xzvf ./下载/THSDataInterface_Linux_20230629 -C ./回测系统/iFinD
当然了,作为刚刚走完一个配置流程的人,我可以直接在根目录的 usr/lib 里面创建好“ bin64 ”这个文件夹,把压缩包直接在这解压完再使用mv等命令操作好,但是这样的话文章写起来就没啥意义了,因为所有这些流程都有内部的逻辑勾稽关系,所以还是当自己是第一次安装来完成配置。
在「同花顺数据接口-帮助中心」的“帮助手册”中可以下载Linux版SDK的安装指引,但是指引的环境依赖等内容就一笔带过了:“在调用前必须调用 ldd libShellExport.so, ldd hqdatafeed 和 ldd libFTDataInterface.so 查看本库所需要依赖的环境是否已经齐全, 如果不齐全,请使用 yum 或者 apt-get 安装。”真正的困难就在这几个依赖的安装上。
libShellExport.so
直接运行命令行会报错:
根据指引的说法,如果没有依赖可以apt-get(试过yum但反正不适合Ubuntu系统)得到相应的文件,但其实这几个.so文件都不能这样得到,仔细观察后才发现libShellExport.so、hqdatafeed、libFTDataInterface.so 都在解压缩/bin64的文件夹里,可以直接终端命令行切入文件夹再ldd相应的文件进行编译,
按照chatGPT老师的答案,它们的文件本质如下。
资料来源:chatGPT
"libShellExport.so"是一个文件。在Linux上,
.so
扩展名通常表示共享库文件(Shared Object),也称为动态链接库。这些文件包含可由多个程序共享和重用的函数和数据。通常,共享库文件具有以下特点:
- 它们包含编译后的代码和数据,可以被其他程序调用。
- 多个程序可以使用同一个共享库文件,减少了代码复制和内存占用。
- 当共享库文件更新时,所有使用它的程序都可以受益于这些更新,而无需重新编译或重新部署。
因此,"libShellExport.so"作为一个
.so
文件,可能是一个供其他程序使用的共享库文件。具体来说,"libShellExport.so"可能包含一些可供Shell脚本或其他程序调用的功能。
但是其实ldd完了似乎也没没什么用,过程中没有报错,然后继续按照指引,在该文件路径下打开终端“python installiFinDPy.py”会返回成功安装好文件的信息,说是在“ /home/hrz/anaconda3/lib/python3.9/site-packages/ ”这个路径下安装成功了:
本以为万事大吉,用vscode打开conda环境下的python 3.9.7,调用iFinDPy是会失败的。
所以回到“ /home/hrz/anaconda3/lib/python3.9/site-packages/ ”的路径查看是否有iFinDPy模块,在该路径的交互界面直接 ctrl + f 可以查找文件,然后发现只有.pth后缀的文件:
打开一看文件里只有一行:/usr/lib/bin64。
解谜iFinDPy.pth
接下来的内容是我将诸多试错融汇起来得到的思考总结,会有一些遗漏,但是整体上足以覆盖关键的信息点。在怎么找都没有找到iFinDPy这个模块以后,自然就能得出这个API是想通过配置在环境变量“ /home/hrz/anaconda3/lib/python3.9/site-packages/ ”下的.pth自动索引到iFinDPy模块,那么首先通过命令行python命令唤醒的是anaconda下的3.9.7版本,自然无法将模块配置到“ 根文件夹目录下的usr/lib ”。
进入真正的根文件夹的方式其实很简单,但是不会有特殊显示(都是base):
cd /
这种时候因为涉及了以前不知道怎么安装python所以弄了十几个版本的历史遗留问题,还是希望能直接用conda下的默认python完成安装,因此做了以下尝试:
1、修改“ /home/hrz/anaconda3/lib/python3.9/site-packages/ ”下的.pth文件的内容,变更为:
/usr/lib/bin64 --> /home/hrz/anaconda3/lib/python3.9/site-packages/bin64
结果vscode里面还是找不到相应模块,尝试失败;
2、不修改.pth内容,把bin64整个文件夹复制到 /usr/lib 中,再在vscode中进行调用,这时终于 可以找到模块 了,只不过报了其他错误:
沿着这个线索,在根目录下的 /usr/lib/bin64 执行ldd编译,返回以下内容:
就是这个 not found 的共享文件涉及最开始指引中所说的“ 若是没有依赖可以使用apt-get获得相应依赖 ” ,如果不配置好该依赖而只是完成了对已有的三个共享文件的ldd 操作 (libShellExport.so、hqdatafeed、 libFTDataInterface.so),vscode中调用iFinDPy模块仍会报OSError的错误,不过是跟libidn11相关的依赖问题。
libidn11配置
幸运的是,百度完以后发现,这个包是有公开获取渠道的:「libidn11」
下载完.deb直接dpkg遇到了之前总是遇到的“E: Sub-process /usr/bin/dpkg returned an error code (1)”的问题,反正又是dpkg抽风了,这次索性写了一个bash脚本“dpkgfix.sh”放到了用户目录下,具体内容写在了另一篇文章里「云平台网络——环境配置(一)」。
这次处理好dpkg再进行.deb文件的安装:
sudo dpkg -i libidn11_1.33-2.2ubuntu2_amd64.deb
然后再对 /usr/lib/bin64 的那仨文件执行ldd就很丝滑了,之前“ not found ”的libidn.so.11这次也有了对应的地址,再在vscode里面看,iFinDPy的模块就有颜色了,python可以找到该模块了。