2015-05-11 6 views
0

Я извлечение JPEG из gphoto2, создавая поток Гио из данных, а затем создать Pixbuf из потока:Python PyGObject pixbuf просачиваться

import gphoto2 as gp 
from gi.repository import Gio, GdkPixbuf 
camera = gp.Camera() 
context = gp.Context 
camera.init(context) 
file = gp.CameraFile() 
camera.capture_preview(file, context) 
data = memoryview(file.get_data_and_size()) 
stream = Gio.MemoryInputStream.new_from_data(data) 
pixbuf = GtkPixbuf.Pixbuf.new_from_stream(stream) 
# display pixbuf in GtkImage 

Функция делает это прикреплена к холостому Gtk с использованием GLib.idle_add(...). Он работает, но он теряет память. Использование памяти процесса постоянно растет. Он течет даже тогда, когда строка, строящая pixbuf, закомментирована, но не тогда, когда строка, строящая поток, также закомментирована, поэтому кажется, что это сам поток течет. Добавление stream.close() после создания pixbuf не помогает.

Какой правильный способ освободить память здесь?

ответ

2

Я бы не назвал это ответом как таковым, и если кто-то знает прямой ответ на вопрос, я рад отметить его как правильный ответ, но вот обходной путь для кого-то еще в том же положении:

import gphoto2 as gp 
from gi.repository import Gio, GdkPixbuf 
camera = gp.Camera() 
context = gp.Context 
camera.init(context) 
file = gp.CameraFile() 
camera.capture_preview(file, context) 
data = memoryview(file.get_data_and_size()) 
loader = GdkPixbuf.PixbufLoader.new() 
loader.write(data) 
pixbuf = loader.get_pixbuf() 
# use the pixbuf 
loader.close() 

Это больше не теряет память.