Pyinstaller打包Pyro4为啥总是报:serializer 'json' is unknown or not available

发布时间 2023-07-27 16:45:22作者: 星尘的博客

现象描述:

在使用Pyro4时,当需要将其打包成exe运行时,总是遇到:Pyro4.errors.SerializeError: serializer 'json' is unknown or not available 的错误提示;
但是当我们直接使用 python xxxx.py 运行或者在IDE中运行时,却又正常,不报错?

定位问题:

通过对源码定位,发现在其*\Lib\site-packagrs\Pyro4\util.py文件中的第812,813行代码如下:

try:
    try:
        import importlib # 812
        json = importlib.import_module(config.JSON_MODULE) # 813
    except ImportError:
        json = __import__(config.JSON_MODULE)
    _ser = JsonSerializer()
    _serializers["json"] = _ser
    _serializers_by_id[_ser.serializer_id] = _ser
except ImportError:
    pass

此处原作者使用的是importlib动态加载,这就是为啥使用pyinstaller打包后,报错的原因
因为pyinstaller在查找库时,是根据文件中的引用关系importfrom逐层寻找的,但是这对importlib动态加载的库可能无能为力。故就导致Pyro4没法初始化得到json这种序列化方式,故报错。

解决办法

解决办法很简单:

  1. 在你的函数中任意位置,我们先指定序列化方式为json(也可以不指定,Pyro会自动查找适合的序列化方式,但是指定最好)
Pyro4.configuration.Configuration.SERIALIZER = "json"
  1. 修改*\Lib\site-packagrs\Pyro4\util.py文件中的第812,813行代码,将动态导入,改为直接导入json
try:
    try:
        import json
        # import importlib # 812
        # json = importlib.import_module(config.JSON_MODULE) # 813
    except ImportError:
        json = __import__(config.JSON_MODULE)
    _ser = JsonSerializer()
    _serializers["json"] = _ser
    _serializers_by_id[_ser.serializer_id] = _ser
except ImportError:
    pass