Seite 1 von 1
[gelöst][md5] Merkwürdiges Problem
Verfasst: Mittwoch 18. Mai 2005, 19:36
von mehrfachstecker
Hallo,
ich lerne im Moment Python und wollte einfach eine kleine Fingerübung machen die mir die (hexadezimale) MD5Summe eines übergebenen Strings auf den Bildschirm »druckt«.
Bei folgendem Skript:
Code: Alles auswählen
#!/usr/bin/env python
from sys import argv
import md5
arguments = argv[1:]
output = ""
for value in arguments:
output = output + "MD5 Summe: "
output = output + md5.new(value).hexdigest()
output = output + "\n"
print output
Bekomme ich diese etwas merkwürdige Fehlermeldung
Code: Alles auswählen
adomanski@wks001:~/Desktop$ ./mdsum.py hallo
Traceback (most recent call last):
File "./md5.py", line 4, in ?
import md5
File "/home/Alexander Domanski/Desktop/md5.py", line 12, in ?
AttributeError: 'module' object has no attribute 'new'
Weis zufällig jemand was diese Meldung zu bedeuten hat? Es klingt für mich wie gesagt merkwürdig.
PS: Wenn ich das Skript im Interpreter eingebe funktioniert es

PPS: Dumm wenn man die Datei md5.py nennt

Re: [gelöst][md5] Merkwürdiges Problem
Verfasst: Donnerstag 19. Mai 2005, 07:11
von gerold
mehrfachstecker hat geschrieben: Bekomme ich diese etwas merkwürdige Fehlermeldung
Code: Alles auswählen
adomanski@wks001:~/Desktop$ ./mdsum.py hallo
Traceback (most recent call last):
File "./md5.py", line 4, in ?
import md5
File "/home/Alexander Domanski/Desktop/md5.py", line 12, in ?
AttributeError: 'module' object has no attribute 'new'
Hi mehrfachstecker!
Du hast im Desktop (in dem du auch dein Skript ausführst) noch eine Datei mit dem Namen "md5.py" liegen. "md5" ist ein Standardmodul von Python. Wenn du im Desktop ein Python-Skript ausführst, dann versucht Python bei der Anweisung "import md5" zuerst im aktuellen Ordner (also Desktop) das Modul "md5.py" zu finden. Da er es in deinem Fall im Desktop findet, versucht Python gar nicht mehr, das richtige (Standardmodul) zu finden und versucht "new" (aus deinem Modul) auszuführen. Da in deinem Modul die Funktion "new" nicht existiert, bekommst du diese Meldung.
Lösung "~/Desktop/md5.py" umbenennen.
mfg
Gerold

Verfasst: Donnerstag 19. Mai 2005, 15:50
von mehrfachstecker
Ja das habe ich jetzt auch schon rausgefunden

. Nur eine kleine Frage hätte ich noch. Das Programm kann auch die MD5Summen von Dateien anzeigen. Nur leider stimmen die nicht mit denen überein die das Konsolenprogramm md5sum mir liefert.
Quelltext von md5sum.py:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sys import argv
import md5
Arguments = argv[1:]
Output = "";
def PrintOut(Value,Output):
Output = Output + "MD5 Summe von " + "\"" + Value + "\"" + ": "
Output = Output + md5.new(Value).hexdigest()
Output = Output + "\n"
return(Output)
if Arguments[0] == "file":
data = file(Arguments[1])
for Value in Arguments[1:]:
Output = PrintOut(Value,Output)
else:
for Value in Arguments:
Output = PrintOut(Value,Output)
print Output
Das obige Programm liefert mir:
adomanski@wks001:~/Desktop$ ./md5sum.py lucid.zip
MD5 Summe von "lucid.zip": 4c0a2eeb29ae1777a4bd40d3eba7a600
Aber »m5sum« liefert mir etwas vollkommen anderes:
adomanski@wks001:~/Desktop$ md5sum lucid.zip
f40791012af9caf0b53950413a6eb640 lucid.zip
Weis zufällig jemand wie man das richtig hinkriegt? »md5sum« aufzurufen und zu parsen hielte ich für unelegant.
Verfasst: Donnerstag 19. Mai 2005, 15:55
von mehrfachstecker
Mmh. Ich weis auch das ich da die Summe des Dateinamens errechne. Nur weis ich nicht wie ich es anders machen sollte. Wenn ich ein »File«-Objekt übergebe meckert md5.new() das es einen String benötigt. Wenn ich das »File«-Objekt in einen String umwandle funktioniert das zwar aber die MD5Summe ist eine andere als die von »m5sum«. Hat irgendwer eine Idee?
Verfasst: Donnerstag 19. Mai 2005, 21:34
von BlackJack
Du willst die Summe über den Inhalt der Datei berechnen, also musst Du den einlesen und an die Funktion übergeben. Bei grossen Dateien, zum Beispiel CD-Images, sollte man das nicht an einem Stück machen, sondern die Datei Häppchenweise einlesen und die `update()` Methode damit aufrufen.
Code: Alles auswählen
import md5
BLOCKSIZE = 8192
def sum_file(fileobj):
summer = md5.new()
while True:
data = fileobj.read(BLOCKSIZE)
if not data:
break
summer.update(data)
return summer.hexdigest()
f = open("test.py")
print sum_file(f)
f.close()
Verfasst: Freitag 20. Mai 2005, 06:23
von jens
Na wenn das nicht mal ein Beitrag für`s
Python-Forum.de - Codesnippets Index & FAQ ist
EDIT: Ein
Antrag ist gestellt

Verfasst: Freitag 20. Mai 2005, 14:13
von mehrfachstecker
Danke BlackJack. Jetzt scheint es zu funktionieren. Ich habe mir gestern noch eine Funktion gefrickelt die die Ausgabe von md5sum parst aber damit war ich unglücklich. Aber jetzt geht es ja.
Code: Alles auswählen
from os import popen
def GetMD5SumOfFile(Filename):
return popen("md5sum" + " " + Filename).read().split(" ")[0]