Seite 1 von 1

dd alternative in Python?

Verfasst: Freitag 13. Oktober 2006, 01:43
von linny
Hallo liebe Forum Gemeinde.
Ich bin noch relativ neu in der Pythonprogrammierung und erst recht hier im Forum. :)
Trotzdem brennt mir eine wichtige Frage auf der Seele.

Ich soll ein Programm schreiben (unter Linux), das Speicherkarten (SD,MMC, usw.) kopiert. Das heißt es soll ein Image einer Mastercard erstellt werden und dann auf biszu 8 Karten gleichzeitig kopiert werden.
Ich weiß, dass es z.b. mit dem dd Befehl von der Shell aus funktioniert. Leider gibt dd aber keine Fortschrittsinformationen aus. Ich komme also nicht drumherum sowas selber zu schreiben.

Jetzt meine Frage. Gibt es in Python irgendeine Möglichkeit direkt auf ein Blockorientiertes Gerät zuzugreifen und davon ein Image zu erstellen, bzw. das image dann wieder blockweise auf ein gerät zu schreiben?

Vielen Dank im voraus.

Linny.

Re: dd alternative in Python?

Verfasst: Freitag 13. Oktober 2006, 09:03
von gerold
linny hat geschrieben:Ich weiß, dass es z.b. mit dem dd Befehl von der Shell aus funktioniert. Leider gibt dd aber keine Fortschrittsinformationen aus.
Hallo Linny!

Willkommen im Python-Forum!

``dd`` gibt immer dann Statusinformationen aus, wenn man an das laufende Programm mit dem Programm ``kill`` das Signal ``USR1`` schickt.

In der englischen MAN-Page von dd ist diese Information ganz unten zu finden.

Manuell lässt sich das ausnützen, wenn man in einer anderen Konsole mit ``watch`` alle paar Sekunden das Signal schickt.

Mit Python lässt sich ``dd`` mit dem Modul ``subprocess`` ansteuern. Damit könnte man dann auch den STDERR-Kanal abhorchen und in einem zweiten Thread alle paar Sekunden ein "USR1" an ``dd`` schicken.

mfg
Gerold
:-)

Verfasst: Dienstag 17. Oktober 2006, 01:02
von linny
Danke erstmal für die Antwort und die Begrüßung und Entschuldigung für die späte Reaktion.
ich war ein paar Tage weg. :)

ich hab mein diesbezügliches Problem bereits anderweitig gelöst.
ich kann ja einfach das Device direkt öffnen und einfach nach und nach alle Blocks mit der jeweiligen Blockgröße auslesen und auf Platte speichern.

Jetzt stehe ich allerdings vor einem anderen viel größeren Problem und ich hab mir schon die finger blutig gegoogelt.

Ich wollte die Änderungen (einsetzen/entfernen) der Speicherkarten per HAL überwachen. Jetzt hab ich natürlich das Problem, dass DBUS nur den glib mainloop unterstützt und ich den ja nunmal nicht in einer QT Anwendung benutzen kann.

Dachte ich mir, machste das eben per DCOP und dem KDED und dem medianotifier.

Jetzt weiß ich aber nicht, wie ich permanent auf DCOP lauschen kann, so daß in meinem Programm ein Event ausgelöst wird wenn KDED einen mediawechsel meldet.
Klar geht das natürlich mit ner while schleife, aber dann steht ja mein programm. Das Lauschen soll also im Hintergrund passieren.

Hat da vielleicht jemand ne Idee? Stichwort Signals/Slots oder ähnliches?

gruß
Linne

Verfasst: Dienstag 17. Oktober 2006, 09:20
von Blattlaus
Nein, die antwort lautet Threads.

Code: Alles auswählen

import threading
from time import sleep

class simpleThread(threading.Thread):
    
    def __init__(self, number):
        self.dead = False
        self.number = number
        threading.Thread.__init__(self) # thread initialisieren
    
    def run(self):
        while not self.dead:
            sleep(0.5)
            print "loop from thread ", self.number
            

s1 = simpleThread(1)
s2 = simpleThread(2)

s1.start()
s2.start()

Verfasst: Dienstag 17. Oktober 2006, 11:48
von linny
Super, danke schön. Wusste gar nicht, dass python threads unterstützt. :)
Man soll halt nachts nicht mehr arbeiten, nein soll man wirklich nicht.... :D

Verfasst: Dienstag 17. Oktober 2006, 12:08
von Blattlaus
linny hat geschrieben:Super, danke schön. Wusste gar nicht, dass python threads unterstützt. :)
Äh...?

Verfasst: Dienstag 17. Oktober 2006, 18:06
von linny
wie gesagt, bin ziemlich neu bei python. vielleicht sollte ich die Doku mal aufmerksamer lesen *kopfkratz.. :roll: