2010-09-23 4 views
10

Ich habe ein Python-Skript geschrieben, um Gstreamer (pygst und gst-Module) zu verwenden, um Replaygain-Tags zu berechnen, und es stürzte inkonsistent mit verschiedenen Gobject-Fehlern ab. Ich fand irgendwo, dass Sie dies, indem Sie den folgenden Text am Anfang des Skripts beheben könnte:Warum stürzt python gstreamer ohne "gobject.threads_init()" am Anfang meines Skripts ab?

import gobject 
gobject.threads_init() 

Ich versuchte es, und es funktionierte. Kann jemand erklären, warum diese Zeilen notwendig sind, und warum pygst das nicht selbst tut?

Antwort

13

Da können Sie Gobject in einer nicht threading-Umgebung verwenden. Dies ist nicht ungewöhnlich. Wenn Sie gobject in einer Threading-Umgebung verwenden, müssen Sie explizit initialisieren, indem Sie gobject.threads_init() aufrufen. Dies stellt auch sicher, dass die When "C" -Funktionen aufgerufen werden, die GIL wird freigegeben.

Auch aus dem Dokument Funktion:

Die threads_init() Funktion initialisiert die Verwendung von Python threading im gobject Modul. Diese Funktion unterscheidet sich von der Funktion gtk.gdk.threads_init() als , diese Funktion initialisiert auch die gdk Threads.

Grundsätzlich sagen Sie Gobject-Modul explizit, dass Sie Threading verwenden und es entsprechend initialisieren werden.

+0

Aber es scheint, dass das Python-Gstreamer-Modul versucht, Threading zu verwenden, egal was passiert, wie die Abstürze zeigen, die auftreten, wenn ich 'threads_init()' nicht aufruft. Wenn es also immer Threading verwendet, sollte es nicht immer initialisiert werden? –

+5

Oder um es unverblümt zu sagen, warum schließt pygst diese Codezeile nicht ein, die benötigt wird, damit sie ohne Absturz funktioniert? –

+2

Ich würde sagen, es ist nicht Pygsts Aufgabe, das zu tun, sondern die Anwendung. Wenn jede Bibliothek/Bindung dies tun würde, würde es jedes Mal erneut ausgeführt werden, wenn Sie eine laden. – XTL

Verwandte Themen