Pyinstaller打包Pyro4为啥总是报:serializer 'json' is unknown or not available
现象描述:
在使用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
在查找库时,是根据文件中的引用关系import
与 from
逐层寻找的,但是这对importlib
动态加载的库可能无能为力。故就导致Pyro4
没法初始化得到json
这种序列化方式,故报错。
解决办法
解决办法很简单:
- 在你的函数中任意位置,我们先指定序列化方式为
json
(也可以不指定,Pyro会自动查找适合的序列化方式,但是指定最好)
Pyro4.configuration.Configuration.SERIALIZER = "json"
- 修改
*\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
本文来自博客园作者:星尘的博客,转载请注明出处:https://www.cnblogs.com/yqbaowo/p/17585356.html