Okay ich hab's mal getestet. Erstmal musste ich es unter Linux zum laufen bekommen. Dabei ist mir folgendes am Quelltext aufgefallen (Vorsicht: lang und unfreundlich
)
Am Anfang fehlt die Unix-#!-Zeile damit das Betriebssystem auch weiss, welcher Interpreter für diese Datei gestartet werden soll:
Einige Zeilen sind länger als 80 Zeichen. Das betrifft zum Beispiel Docstrings. Die werden per Konvention als mehrzeilige Zeichenketten mit ``"""`` angelegt.
Du verletzt die Namenskonventionen mit fast allen Variablen. Grosse Anfangsbuchstaben kennzeichnen in vielen Programmiersprachen Klassen und nicht Inkarnationen von Klassen. Der Python Style-Guide geht sogar so weit, in Funktionsnamen nur Kleinbuchstaben zu verwenden.
Was beim Importieren eines Moduls ausgeführt wird, sollte sich auf das minimal Notwendige beschränken. Bei Dir läuft der komplette Code dabei ab. Das hat mehrere Nachteile. Zum einen kann man das Modul nicht im Pythoninterpreter importieren und die Funktionen einzeln ausprobieren. Zum anderen hast Du auf diese Weise viele globale Variablen, was die Gefahr der Abhängigkeiten von Funktionen erhöht. Bei `DeactivateNTFScompression` verwendest Du zum Beispiel den Parameter `File` gar nicht und benutzt stattdessen das globale `EraserFile`. Das ist ein Fehler der Dir aufgefallen wäre, wenn `EraserFile` nicht global sondern nur in einer `main()` Funktion existieren würde.
`EraserFile` ist nicht portabel weil ein '\' hart kodiert ist, der unter Linux/Unix besser ein '/' sein sollte. Am einfachsten ist es, wenn man für Operationen mit Pfadnamen die Funktionen aus `os.path` benutzt:
In `getFreeSpace` wird eine Zeichenkette als Ausnahme benutzt, das ist "deprecated". Ausserdem schlägt diese Ausnahme bis zum Benutzer durch und der bekommt einen Traceback präsentiert. Und die Ausnahme tritt bei mir wirklich auf, weil es 'posix' bei `sys.platform` wohl nicht gibt. Bei mir steht dort 'linux2'. Du solltest besser `os.name` verwenden und auf 'nt' bzw. 'posix' testen. Da kann man sicher sein, das nur die in der Dokumentation erwähnten Namen auftreten können: 'posix', 'nt', 'mac', 'os2', 'ce', 'java', 'riscos'.
Das Modul `statvfs` benötigt man nicht mehr -- die Informationen sind auch als Attribute des Rückgabewertes von `os.statvfs()` abfragbar, also:
Code: Alles auswählen
stats = os.statvfs('/')
return stats.f_bavail * stats.f_bsize
Du testest, ob der Laufwerksname zwei Zeichen lang ist und das zweite Zeichen ein ':' ist. Damit funktioniert das Programm nicht unter Unix. Laufwerksnamen gibt es dort nicht und ein Mountpoint kann so ziemlich überall in der Verzeichnishierarchie eingehängt sein.
Zur Ausgabe von Fehlern kann man die `error()` Methode vom optparse-Parser benutzen. Dann wird die Fehlermeldung nach der kurzen Benutzungsinformation ausgegeben.
Dateien zu öffnen und sie nicht wieder zu schliessen ist schlechter Stil. Dazu zählen auch Dateien, die von einem Aufruf von `os.popen()` zurückgegeben werden.
Das deaktivieren der NTFS-Komprimierung gibt unter Linux natürlich einen Fehler aus.
Im Englischen gibt es übrigens nur recht selten zusammengesetzte Worte mit einem Bindestrich und es wird mehr klein geschrieben. Also "random bytes" statt "Random-Bytes" und "blocksize" statt "Block-Size".
Zum Schluss der Test:
Code: Alles auswählen
python PyDiskEraser_v006,5.py /old.data/
# versus
dd_rescue -b 10M -m 1G /dev/zero /old.data/test.dat
Ist bei mir gleich schnell. Am Anfang wird viel/schnell geschrieben -- in den Cache vom Betriebssystem und der Festplatte, danach werden beide Programme gleichermassen "langsam". Die durchschnittliche Geschwindigkeit ist nahezu gleich.