Shelve продолжает забывать переменные, которые он содержит

#python #python-3.x #module #shelve

#python #python-3.x #модуль #shelve

Вопрос:

Я учусь сам, как Python3. Я хотел потренировать свои приобретенные навыки и написать программу резервного копирования из командной строки. Я пытаюсь сохранить резервную копию по умолчанию и сохранить местоположения с помощью Shelve модуля, но, похоже, он продолжает забывать переменные, которые я сохраняю всякий раз, когда я закрываю или перезапускаю программу.

Вот основная функция, которая работает с полками:

 def WorkShelf(key, mode='get', variable=None):
    """Either stores a variable to the shelf or gets one from it.
    Possible modes are 'store' and 'get'"""
    config = shelve.open('Config')

    if mode.strip() == 'get':
        print(config[key])
        return config[key]

    elif mode.strip() == 'store':
        config[key] = variable
        print(key,'holds',variable)

    else:
        print("mode has not been reconginzed. Possible modes:nt- 'get'nt-'store'")

    config.close()
  

Итак, всякий раз, когда я вызываю эту функцию для сохранения переменных и сразу после этого вызываю функцию, она работает отлично. Я попытался получить доступ к полке вручную, и все там есть.
Это код, используемый для хранения переменных:

 WorkShelf('BackUpPath','store', bupath)
WorkShelf('Path2BU', 'store', path)
  

Проблема возникает, когда я пытаюсь получить свои переменные с полки после перезапуска скрипта. Этот код:

 config = shelve.open('Config')
path = config['Path2BU']
bupath = config['BackUpPath']
  

Выдает мне эту ошибку:

 Traceback (most recent call last):
  File "C:Python35-32libshelve.py", line 111, in __getitem__
    value = self.cache[key]
KeyError: 'Path2BU'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    config['Path2BU']
  File "C:Python35-32libshelve.py", line 113, in __getitem__
    f = BytesIO(self.dict[key.encode(self.keyencoding)])
  File "C:Python35-32libdbmdumb.py", line 141, in __getitem__
    pos, siz = self._index[key]     # may raise KeyError
KeyError: b'Path2BU
  

В принципе, это ошибка, которую я мог бы воспроизвести, вызвав ShelveObject[‘ThisKeyDoesNotExist’].

Я действительно потерян прямо сейчас. Когда я пытаюсь вручную создать полку, закрыть ее и снова получить к ней доступ, кажется, что это работает (хотя я получал ошибку, делая это раньше). Я прочитал каждый пост, касающийся этого, я думал о повреждении полки (но вряд ли это происходит каждый раз), и я прочитал свой скрипт от А до Я уже около 20 раз.

Спасибо за любую помощь (и я надеюсь, что на этот раз я задал свой вопрос правильно)!


Редактировать


Ладно, это сводит меня с ума. Изоляция WorkShelf() работает отлично, вот так:

 import shelve

    def WorkShelf(key, mode='get', variable=None):
        """Either stores a variable to the shelf or gets one from it.
        Possible modes are 'store' and 'get'"""
        config = shelve.open('Config')

        if mode.strip() == 'get':
            print(config[key])
            return config[key]

        elif mode.strip() == 'store':
            config[key] = variable
            print(key,'holds',variable)

        else:
            print("mode has not been reconginzed. Possible modes:nt- 'get'nt-'store'")

        config.close()

    if False:
        print('Enter path  n1: ')
        path1 = input("> ")
        WorkShelf('Path1', 'store', path1)

        print ('Enter path n2: ')
        path2 = input("> ")
        WorkShelf('Path2', 'store', path2)

    else:
        path1, path2 = WorkShelf('Path1'), WorkShelf('Path2')
        print (path1, path2)
  

Нет проблем, идеально.

Но когда я использую ту же функцию в своем скрипте, я получаю этот вывод. В основном это говорит мне, что он записывает переменные в файлы shelve (сообщение «Этот ключ содержит эту переменную»). Я даже могу вызывать их с помощью того же кода, который я использую при перезапуске. Но при вызове их после сброса программы все это похоже на «Что вы говорите о m8? Я никогда не сохранял их ‘.

 Welcome to this backup manager.
We will walk you around creating your backup and backup preferences

What directory would you like to backup?
Enter path here: W:UsersDamienDocumentsCodeCode Pyth
Would you like to se all folders and files at that path? (enter YES|NO)
> n


Okay, let's proceed.
Where would you like to create your backup?
Enter path here: N:

Something already exists there: 
19 folders and 254 documents

Would you like to change your location?
> n
Would you like to save this destination (N:) as your default backup location ?    That way you don't have to type it again.
> y
BackUpPath holds N:

If you're going to be backing the same data up we can save the files location W:UsersDamienDocumentsCodeCode Pyth    so you don't have to type all the paths again.
Would you like me to remember the backup file's location?
> y
Path2BU holds W:UsersDamienDocumentsCodeCode Pyth
>>> 
======== RESTART: W:UsersDamienDocumentsCodeCode PythBackup.py ========
Welcome to this backup manager.
Traceback (most recent call last):
  File "C:Python35-32libshelve.py", line 111, in __getitem__
    value = self.cache[key]
KeyError: 'Path2BU'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "W:UsersDamienDocumentsCodeCode PythBackup.py", line 198, in <module>
    path, bupath = WorkShelf('Path2BU'), WorkShelf('BackUpPath')
  File "W:UsersDamienDocumentsCodeCode PythBackup.py", line 165, in WorkShelf
    print(config[key])
  File "C:Python35-32libshelve.py", line 113, in __getitem__
    f = BytesIO(self.dict[key.encode(self.keyencoding)])
  File "C:Python35-32libdbmdumb.py", line 141, in __getitem__
    pos, siz = self._index[key]     # may raise KeyError
KeyError: b'Path2BU'
  

Пожалуйста, помогите, я схожу с ума и мог бы разработать класс для хранения и получения переменных из текстовых файлов.

Ответ №1:

Хорошо, итак, я только что обнаружил, что пошло не так.

У меня был os.chdir () в моем установочном коде. Всякий раз, когда настройка была выполнена, и я хотел открыть свои конфигурационные файлы, это выглядело бы в текущем каталоге, но полки находились в каталоге, на который os.chdir () указал в настройке.

По какой-то причине у меня оказались пустые полки в каталоге, в котором должны были быть фактические. Это стоило мне дня отладки.

На сегодня все, ребята!