[gelöst][md5] Merkwürdiges Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mehrfachstecker
User
Beiträge: 5
Registriert: Mittwoch 11. Mai 2005, 15:22

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 :roll:
PPS: Dumm wenn man die Datei md5.py nennt :D
Zuletzt geändert von mehrfachstecker am Freitag 20. Mai 2005, 15:02, insgesamt 2-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mehrfachstecker
User
Beiträge: 5
Registriert: Mittwoch 11. Mai 2005, 15:22

Ja das habe ich jetzt auch schon rausgefunden :D. 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.
mehrfachstecker
User
Beiträge: 5
Registriert: Mittwoch 11. Mai 2005, 15:22

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?
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()
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Na wenn das nicht mal ein Beitrag für`s Python-Forum.de - Codesnippets Index & FAQ ist :D

EDIT: Ein Antrag ist gestellt :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mehrfachstecker
User
Beiträge: 5
Registriert: Mittwoch 11. Mai 2005, 15:22

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]
Antworten