akshare使用pyinstaller打包exe无法正常运行

2024-12-25 问题记录

问题描述

前两天不是说写了一个摸鱼小工具吗,使用python写的,需要python环境才能运行,想着给它打包成exe就可以直接运行了。但是在打包成exe之后却无法正常运行,一运行就报错,报错信息如下:

Traceback (most recent call last):
  File "\\192.168.31.122\devops\code\jupyter_notebook\tmp\stock_monitor.py", line 3, in <module>
    import akshare as ak
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 384, in exec_module
  File "akshare\__init__.py", line 4485, in <module>
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 384, in exec_module
  File "akshare\stock_feature\stock_a_pe_and_pb.py", line 320, in <module>
  File "py_mini_racer\py_mini_racer.py", line 178, in __init__
  File "py_mini_racer\py_mini_racer.py", line 125, in _build_ext_handle
RuntimeError: Native library not available at C:\Users\admin\AppData\Local\Temp\_MEI128482\mini_racer.dll

经过一翻资料翻阅和测试,最终发现下面的解决办法可以解决,记录一下

处理办法

通过--add-data添加依赖文件到打包文件内

  • --add-data "Z:\code\jupyter_notebook\myenv\Lib\site-packages\py_mini_racer\mini_racer.dll;."
  • --add-data "Z:\code\jupyter_notebook\myenv\Lib\site-packages\akshare\file_fold\calendar.json;./akshare/file_fold"

这两个选项解决了以下问题:

  1. mini_racer.dll 缺失py_mini_racer 的核心依赖动态库无法加载。
  2. calendar.json 缺失akshare 静态文件无法访问导致程序运行失败。

通过手动指定的方式将它们添加它们到打包文件后,运行时能够正确找到这些依赖文件,因此问题解决。

pyinstaller --clean --noconfirm --add-data "Z:\code\jupyter_notebook\myenv\Lib\site-packages\py_mini_racer\mini_racer.dll;." --add-data "Z:\code\jupyter_notebook\myenv\Lib\site-packages\akshare\file_fold\calendar.json;./akshare/file_fold" --onefile --windowed stock_monitor.py