Почему эта строка не сохраняется в глобальной переменной?

#python-3.x #bytesio

#python-3.x #bytesio

Вопрос:

Я пишу приложение, используя Python и Kivy. У меня есть функция, которая рисует изображение и экспортирует его в формате png. Я пытаюсь использовать это изображение и сохранить его в базе данных sql в виде большого двоичного объекта.

Маршрут, который я пытаюсь выбрать, состоит в том, чтобы преобразовать png в поток с помощью BytesIO, а затем поместить это значение (строку) в переменную, которую я затем могу отправить в БД.

Проблема, с которой я сталкиваюсь, заключается в том, что в «локальной» функции я могу преобразовать объект png в поток и распечатать его, но когда я пытаюсь напечатать эту же переменную вне функции, она возвращает пустую.

Любая помощь в понимании была бы замечательно оценена! Я думаю, это потому, что я использую память функции для преобразования png> IO, и при выходе из функции ей это не нравится. Или, если у вас есть какие-либо лучшие решения, я весь внимание.

  def savevar(self):
        global driversig
        data = io.BytesIO(open("B.png","r b").read())
        test = (data.getvalue())

#i've also tried wrapping this in a str() but getvalue() is a string so shouldn't matter?

        driversig = test
        print(driversig)
#this prints fine.
  

Когда я пытаюсь print(driversig) выйти за пределы этой функции, она возвращает пустую

Я также пытался print(str(driversig))

моя глобальная переменная пуста. driversig = '' просто, если вам интересно. Я также не получаю никаких ошибок при печати

Комментарии:

1. Зачем вы вообще это делаете BytesIO ? open(...).read() выдает вам содержимое файла, помещая его в BytesIO объект, а затем извлекая его, это просто пустая трата усилий.

2. Вы уверены, что фрагмент кода, который вы нам показали, соответствует вашему реальному коду? Потому что я не могу воспроизвести эту проблему. Возможно, вы read() вводите данные из (реального) файла более одного раза (т. Е. в цикле), и поэтому в конце вы получаете пустой результат, потому что весь файл уже прочитан? Для тестирования, возможно, измените print строку на print("driversig is", repr(driversig)) , чтобы вы могли видеть, печатал ли он пустой результат после успешных.

3. @jasonharper Мне нужен поток для записи в БД нет? Сейчас я попробую ваш метод.

4. @Blckknght arrr да, это может быть так, хотя цикла, конечно, нет. Странно то, что если я помещаю содержимое файла png в переменную, а затем печатаю эту переменную внутри функции.. она печатает, но когда она находится за ее пределами, этого не происходит. Это не весь код, но функция представлена целиком. Другие биты просто вызывают или печатают эту переменную вне этой функции. Я попробую это устранить.

5. @jasonharper ты прав! вызов ее без завершения приводит к той же строке. Но все еще не сохраняется в глобально назначенной переменной.

Ответ №1:

Итак, я разобрался с проблемой:

driversig = '' является глобальным

 def savevar(self):
        global driversig
        data = open("B.png","r b").read()
        test = (data.getvalue())    

        driversig = str(test)
#       ^^ this *change* is now for the local variable and is not effecting the global variable

        print(driversig)
#       ^^ hence why this prints correctly

  

глобальная переменная driversig по-прежнему является пустой строкой, и я пытаюсь вызвать эту локальную, driversig которая содержит байты (в виде строки) глобально; но на самом деле я вызываю глобальную переменную emtpy.

Извините, ребята, и спасибо вам!