使用Kutana框架时pickle序列化Game类对象报错求助
问题:Pickle序列化Kutana插件中的Game实例失败
我正在使用Kutana框架,相关代码如下:
plugins/test.py
from kutana import Plugin import pickle plugin = Plugin(name="Tictactoe", description="Tictactoe Game", invites={}, games=[]) @plugin.on_start() async def _(): plugin.games = [Game()] # Backup games when bot is shutting down @plugin.on_shutdown() async def _(): try: with open("games.pickle", "wb") as f: pickle.dump(plugin.games, f) except Exception as e: print(e) class Game: def __init__(self): pass
run.py
from kutana import Kutana, load_plugins # Create application app = Kutana() # Load and register plugins app.add_plugins(load_plugins("plugins/")) if __name__ == "__main__": # Run application app.run()
当plugin.games为空时,pickle可正常序列化;但放入Game类实例后,备份时会报错:
Traceback (most recent call last): File "C:\Users\root\Desktop\Celestiana\plugins\games\tictactoe.py", line 17, in _ pickle.dump(pl.games, f) _pickle.PicklingError: Can't pickle <class 'plugins/games\tictactoe.py.Game'>: import of module 'plugins/games\\tictactoe.py' failed
我尝试使用pickle.dump(plugin.games, f, fix_imports=True)但无效,请问该如何修复?
解决方案
方法一:将Game类移到独立可导入模块
- 在
plugins目录下创建game_classes.py文件,存放Game类:
# plugins/game_classes.py class Game: def __init__(self): pass
- 在
plugins/test.py中相对导入该类:
from kutana import Plugin import pickle from .game_classes import Game # 相对导入 plugin = Plugin(name="Tictactoe", description="Tictactoe Game", invites={}, games=[]) # 后续代码保持不变
- 确保
plugins目录下有__init__.py(空文件即可),让Python识别为合法包。
方法二:手动修正类的模块路径
如果不想拆分模块,可在Game类定义后手动设置__module__属性,让pickle能正确识别模块路径:
class Game: def __init__(self): pass # 根据你的插件实际路径设置,比如插件是games/tictactoe.py就写"plugins.games.tictactoe" Game.__module__ = "plugins.test"
内容的提问来源于stack exchange,提问作者user14038884
相关产品推荐
相关产品推荐

