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.
dd alternative in Python?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Linny!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.
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
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
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()