habe irgendwie ein unreproduzierbares und mir unerklärliches Problem.
Gleich vorneweg es ist daher sehr kompliziert das Skript zu testen und mit einem Zeitaufwand verbunden.
Ich bin dabei ein Programm zu schreiben, welches einem beim Remastern von Knoppix helfen soll.
Dafür muss ich eine ganze Menge an externen Programmen ausführen und habe daher für diese Ausführungen einen 2. Prozess gewählt.
Dieser sendet die Daten über eine Pipe, die von gobject.io_add_watch abgehört wird, an das GUI.
Passiert nun ein Fehler macht das Programm alles rückgängig und soll danach noch eine Fehlermeldung anzeigen.
Dazu sendet es einen Tuple ('error', fehlermeldung) an den GUI-Prozess, was auch funktioniert, genau wie der Rest des GUIs (z.B. Statusupdates).
Doch der dann erzeugte MessageDialog wird einfach nicht angezeigt.
Ich führe run() aus, die Funktion bleibt stehen aber der Dialog geht nicht auf.
Folgender Code, der im Grunde das gleiche macht funktioniert jedoch:
Code: Alles auswählen
import time
import multiprocessing
import gtk
import gobject
def test(pipe):
pipe.send('hallo')
time.sleep(10)
pipe.send('welt')
def update(fd, condition):
dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=fd.recv())
dialog.run()
dialog.destroy()
return True
pipe_parent, pipe_child = multiprocessing.Pipe()
process = multiprocessing.Process(target = test,
args = (pipe_child,))
gobject.io_add_watch(pipe_parent, gobject.IO_IN | gobject.IO_PRI, update)
process.start()
gtk.main()
Da ich das Problem nicht mit einem kürzeren und einfacherem Code reproduzieren kann hier der gesamte Code:
https://github.com/koehlma/remasterscri ... nxremaster
In dem GIT-Repo ist auch noch die erste Version des Skriptes drin, aber man kann die __init__.py von knxremaster als eigenständiges Programm aufrufen.
Dazu braucht man allerdings noch eine Reihe an externen Programmen, was sich dann eher kompliziert gestaltet.
Der Fehler ist in dieser Datei in Zeile 47 bis 52.
Vielleicht will sich ja jemand die Mühe machen und sich das mal angucken.
Installieren kann man das ganze wie folgt:
Von hier die Dateien create_compressed_fs.static und extract_compressed_fs.static herunterladen und nach '/opt/remasterscript/bin/' kopieren und dabei das .static aus dem Dateinamen entfernen.
Dann braucht man eigentlich nur noch PyGTK und PyGObject und ein ISO von Knoppix.
Das ISO-Image kann man dann mit
Code: Alles auswählen
sudo mount -t iso9660 -o ro <ISO-Dateiame> <Zielverzeichnis>
Nach einem Start des Skriptes als root drückt man auf "Remaster Erstellen" wählt als Quelle das Verzeichnis des gemounteten ISOs.
Als Ziel ein beliebiges leeres Verzeichnis.
Dann drückt man auf "Erstellen".
Um nun einen Fehler zu produzieren schießt man den Prozess /opt/remasterscript/bin/extract_compressed_fs ab.
Dieser entsteht, wenn der Fortschrittsbalken "Dekomprimiere Image" anzeigt.
Nun löscht das Skript die erstellten Dateien und gibt auf der Konsole die Instanz des Dialoges aus, der nicht angezeigt wird.
Ich weiß, dass das alles ein bisschen sehr kompliziert und zeitaufwendig ist.
Lieber würde ich eine kleinere und einfachere Version präsentieren, aber das Problem bekomme ich einfach nicht isoliert.
/* Edit:
Eines habe ich vergessen:
Wenn ihr meint, dass das ganze Konzept schlecht ist, dann freue ich mich auch gerne, ungeachtet des eigentlichen Problemes, auf Verbesserungs-Vorschläge.
*/
Vielen Dank fürs Lesen und Viele Grüße
Maxi