Akshare模块引发的打包编译问题

2023年2月18日 1532点热度 0人点赞 2条评论

最近想给自己的交易程序添加一些自动化功能,将可转债的筛选过滤与实盘操作全部交给机器运行。

之前关于实时价格和K线数据的获取都是用的自己写的爬虫模块,稳定运行没啥问题(一共实现了四个接口,两个日用,两个备用)。可转债这块我犯了次懒,没有再写爬虫,而是导入了Akshare这个金融数据包。结果就是因为这个包的引用,导致程序后来打包编译的时候问题不断。

很多特别细节的东西已经记得不是太清楚了,大致出现的问题和解决如下:

所有的开发测试都完成后,准备打包成exe,部署到我的实盘交易机器上。编译的时候没有问题,但是运行exe时报错,提示mini_racer.dll缺失。我之前pyinstaller的编译参数用的 -F ,更换成 -D 以目录形式进行编译后,将整个dll扔进了提示缺失文件的位置上,再次运行程序,又产生一个错误,这次提示的是缺少一个json文件,同理,我又从akshare目录里把整个json拷贝出来到缺失的位置上,再次运行程序,结果又报了一个文件缺失,天知道还有多少同类问题等着我?实在没有办法下,考虑到我只用了akshare中的3个数据接口,结果就自行把这三个接口从akshare库中剥离了出来,放进了自己的爬虫模块里,至此,我的程序已不再和akshare有引用关系,和akshare相关引发的问题算是解决了。

然而,后面依然不是一帆风顺,在测试exe运行的时候,我发现在某段固定代码的位置会引发异常,这是一段pandas的dataframe操作代码,奇怪的是,以脚本运行程序时,这段代码完全没有问题,但是编译后运行,这段代码只能返回一个空的dataframe,且不会引发代码内部的try except块,问题到这里我就头疼了,因为我压根不知道发生了什么,究竟是什么问题导致的错误?为什么错误不能被try块捕获?

这个问题卡了我好久,直到我看到网上一位老哥的文章,他的文章地址我忘记了,大意是说他用flask开发了个程序要去部署,但是编译出来的文件一直莫名其妙的跑不起来,直到老哥给pyinstaller做了降级,问题得以解决。我突然想起来,我前不久是给venv环境中的pyinstaller做个一次升级,要不然我也试试旧版?于是手动给pyinstaller进了降级,降到了5.4这个版本(之前让我手动升级到了5.8),换成5.4版本后重新编译了一次程序,再次运行,一切正常,没有再出现问题。

这次的问题从发生到解决,足足浪费了我一天的时间,总结下来:

1、第三方包能少用尽量少用,简单的功能自己能实现尽量自己弄,不然开发一时爽,编译火葬场。

2、pyinstaller真是个谜之软件,出现问题优先考虑升级,问题没解决,考虑降级,都没解决?再考虑自己代码的问题。我前面说的dataframe返回为空的问题,到问题解决,我都不知道原因是啥。

最后念叨一下我的软件进展,经过这两天集中精力撸码,已经基本实现了完全的交易自动化,从标的的选择到创建标的配置文件进入引擎操作,再到一定周期后的策略表现评价与汰弱留强,整个交易逻辑闭环已经通过程序予以了实现,现在在交易时段需要做的越来越少,理论上我可以什么都不用管,24小时无人值守的运行。具体效果怎样要看市场结出什么样的果子,至于我可能也就是看看程序有没有bug就好。

我想人有时候对“懒”的极致追求并不是坏事。

PS:网上看到一篇文章,关于解决引用pyminiracer后的打包问题,记录如下:

windows下将mini_racer.dll文件,复制到你的工作目录下,编译时用:pyinstaller --clean -F --add-data mini_rarcer.dll;. xxxxx.py

注意文件mini_rarcer.dll后是分号加点

mac下是libmini_rarcer.dylib文件,复制到你的工作目录下,打包时执行如下命令:pyinstaller --clean -F --add-data libmini_racer.dylib:. xxxx.py

注意文件libmini_racer.dylib后是冒号加点

原贴地址:https://blog.csdn.net/rainolt/article/details/121449660

QThinker

前地产从业者,假装是个程序员,热爱编程与交易 自研QThinker量化交易框架

文章评论

  • 科技0x7

    我也遇到了同样的问题,但是实际上,问题仅仅是calendar.json和mini_racer.dll的缺失,并不如同您所说的“再次运行程序,结果又报了一个文件缺失,天知道还有多少同类问题等着我?”。

    2023年4月27日
    • qthinker

      @科技0x7 具体情况可能各有不同,总之能够解决就好:)

      2023年4月28日