Python-将flask应用程序的名称更改为app.py时发生ModuleNotFoundError。可能的解决方案?

Python-将flask应用程序的名称更改为app.py时发生ModuleNotFoundError。可能的解决方案?,python,flask,Python,Flask,我最近将我的flask应用程序主文件从inputServer.py更改为app.py,以提高易用性 我抛出错误的代码如下所示: def readBackupPlayers(objectFile): with open(objectFile, 'rb') as openedFile: manager.playerList = pickle.load(openedFile) print('Backup of players retrieved') ^ 函数,用于读取

我最近将我的flask应用程序主文件从inputServer.py更改为app.py,以提高易用性

我抛出错误的代码如下所示:

def readBackupPlayers(objectFile):
    with open(objectFile, 'rb') as openedFile:
        manager.playerList = pickle.load(openedFile)
    print('Backup of players retrieved')
^ 函数,用于读取自定义pickle文件,该文件用于备份存储在自定义对象中的列表

class PlayerManager:
    def __init__(self):
        self.playerList = []
        self.ID = len(self.playerList) + 1
        self.currentGame = None
        self.tournament = None


manager = PlayerManager()
^ 声明类并创建其实例以用于在程序中存储变量的代码

错误消息:

File "c:\users\simon\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\simon\OneDrive\Documents\AtomTesting\app.py", line 356, in setup
    readBackupPlayers('Backups/playerBackup')
  File "C:\Users\simon\OneDrive\Documents\AtomTesting\app.py", line 72, in readBackupPlayers
    manager.playerList = pickle.load(openedFile)
ModuleNotFoundError: No module named 'inputServer'
目录:

AtomTesting -
   Backups -
      playerBackup
      tournamentBackup
   Static -
      static Flask files (not relevant)
   templates -
      Flask templates (not relevant)
   app.py (renamed from inputServer.py)
   config.py
   README.md

下面是正在发生的事情。Python的pickle模块根据Python对象的名称对其进行序列化和反序列化(转储和加载)。由于类所在模块的名称已更改,Pickle无法确定如何重新实例化这些对象

然而,有一个解决办法是。它涉及将旧名称映射到新名称:

导入pickle
重命名表={
“inputServer”:“应用程序”,
}
def映射名称(名称):
如果名称在重命名表中:
返回重命名表[名称]
返回名称
def映射_加载_全局(自):
module=mapname(self.readline()[:-1])
name=mapname(self.readline()[:-1])
klass=self.find_类(模块,名称)
self.append(klass)
def加载(str):
file=StringIO(str)
unpickler=pickle.unpickler(文件)
unpickler.dispatch[pickle.GLOBAL]=映射的\u加载\u全局
返回unpickler.load()
或者,这可能是一种更好的方法,您不应该对任何严肃的数据存储使用pickle,尤其是在应用程序的不同版本之间可能会使用某些东西时


你可以考虑使用一个轻量级数据库的ORM,比如SQLite。< /P>你需要重新处理备份文件,解决了它。因此,我假设Pickle有某种指向存储类的特定模块的指针?Pickle在编写Pickle文件时存储类/模块名等。这就是为什么将pickle用于数据存储通常是个坏主意的原因——这就像将类名放入数据库中一样。是否有其他库可以实现类似的目标?这是一个相当小的项目,但我想为将来了解更多。使用数据库。Sqlite是一个很好的开始选择。将数据存储为表。不要在数据库中存储任何与代码密切相关的内容