Python - ModuleNotFoundError при изменении имени flask приложения на app.py. Возможные решения? - PullRequest
3 голосов
/ 14 июля 2020

Недавно я изменил свой основной файл приложения flask с inputServer.py на app.py, чтобы упростить использование.

Мой код, который вызывает ошибку, выглядит следующим образом:

def readBackupPlayers(objectFile):
    with open(objectFile, 'rb') as openedFile:
        manager.playerList = pickle.load(openedFile)
    print('Backup of players retrieved')

^ Функция, которая читает настраиваемый файл рассола, используемый для резервного копирования списка, хранящегося внутри настраиваемого объекта

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

1 Ответ

1 голос
/ 15 июля 2020

Вот что происходит. Модуль pickle Python сериализует и десериализует (выгружает и загружает) объекты Python на основе их имени. Поскольку имя модуля, в котором находится ваш класс, изменилось, Pickle не может понять, как заново создать экземпляры этих объектов.

Однако существует решение, подробно описанное в Python вики . Он включает сопоставление старых имен с новыми именами:

import pickle


renametable = {
    'inputServer': 'app',
    }

def mapname(name):
    if name in renametable:
        return renametable[name]
    return name

def mapped_load_global(self):
    module = mapname(self.readline()[:-1])
    name = mapname(self.readline()[:-1])
    klass = self.find_class(module, name)
    self.append(klass)

def loads(str):
    file = StringIO(str)
    unpickler = pickle.Unpickler(file)
    unpickler.dispatch[pickle.GLOBAL] = mapped_load_global
    return unpickler.load()

В качестве альтернативы, и это, вероятно, лучший подход, вам не следует использовать pickle для любого серьезного хранилища данных, особенно когда что-то может использоваться между версиями вашего app.

Вы можете рассмотреть возможность использования ORM с легкой базой данных, например SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...