python script stoppt ohne grund?

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
wislak
User
Beiträge: 2
Registriert: Donnerstag 25. Februar 2010, 18:09

ich wollte mir ein python script zum backupen meiner dateien schreiben.
Hat auch ganz gut funktioniert, wenn ich es mit ordnerstruckturen getestet haben.
Aber beim Anwenden auf alle dateien stoppt das script bei der Ausführung.
Es bleibt immer bei m gleichen Verzeichnis stehen. aber in dem Verzeichnis ist nichts ungewöhnliches??? Kann mir jemand weiterhelfen, für mich hat sich noch keine logische erklärung ergeben. Das Programm führe ich immer über die Ubuntu shell aus. In der shell hab ich zuvor die admin rechte freigeschaltet (sudo -s).

Das Verzeichnis bei dem das Programm stoppt ist "/sys/kernel//debug/tracing/per_cpu/cpu1/"

aber alle Dateien im Verzeichnis werden noch erstellt.

infos:
Betriebssystem:Ubuntu 9.1
python: 2.6
Programm:

Code: Alles auswählen


import os
import time
import shutil

mainsaveverzeichnis= r'/home/reini/Desktop/Backup'
mainverzeichnis = r'/'

def get_verzeichnisse(curpath,savepath):

	try:
		os.listdir(curpath)
	except:
		print "Auf Pfad"+curpath+"kann nicht zugegriffen werden"
	else:
		verzeichnisse=os.listdir(curpath)
		for line in verzeichnisse:

			try:
				os.path.isdir(curpath+r'/'+line)
			except:
				print "Auf Pfad"+curpath+r'/'+line+"kann nicht zugegriffen werden"
			else:
				link=0
				if os.path.isdir(curpath+r'/'+line):
					link=check_verzeichnisse(savepath+r'/'+line+r'/',curpath+r'/'+line)
					if link == 1:
						get_verzeichnisse(curpath+r'/'+line,savepath+r'/'+line)
				elif os.path.isfile(curpath+r'/'+line):
					check_datei(curpath+r'/'+line,savepath,line)
def check_verzeichnisse(path,orpath):


	try:
		os.readlink(orpath)
	except:
		if os.path.isdir(path):
			print"-----------------------"
		else:
			os.mkdir(path)
		return 1
	else:
		print path+"ist ein link"
		
def check_datei(maindatei,saveverzeichnis,savedatei):

	print maindatei
	if os.path.isfile(saveverzeichnis+r'/'+savedatei):
		lastmod=os.path.getmtime(maindatei)
		lastmods=os.path.getmtime(saveverzeichnis+r'/'+savedatei)
		if lastmod < lastmods:
			print savedatei+" ist aktuell"
		else:
			try:
				shutil.move(maindatei,saveverzeichnis+r'/'+savedatei)
			except:
				"fehler bei kopieren"
			else:
				shutil.copy(maindatei,saveverzeichnis+r'/'+savedatei)
				print savedatei+" wurde kopiert"
	else:
		try:
			shutil.copy(maindatei,saveverzeichnis+r'/'+savedatei)
		except:
			print "fehler bei erstellen der datei "+savedatei
		else:
			shutil.copy(maindatei,saveverzeichnis+r'/'+savedatei)
			print savedatei+ " wurde erstellt"		
		




get_verzeichnisse(mainverzeichnis,mainsaveverzeichnis)
das Programm ist noch nicht ganz Vollendet. Falls ihr kommentare zum Programm braucht stelle ich die auch gerne zur Vergügung. einfach sagen :P

PS: bin in python noch rel. unerfahren genauso wie mit der Ubuntu shell.

DANKE schon mal fürs durchlesen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Was heißt denn "stoppt das Programm"? Tut es nichts mehr, bleibt es nach irgend einer Ausgabe hängen oder gibt es gar eine Exception?

Noch ein paar kurze Hinweise zu deinem Code:
- Vermische keine deutschen und englischen Namen, du solltest dich für eine Sprache, am besten Englisch, entscheiden. Ein Mix sieht schon sehr verwirrend aus.
- Verwende auch Aussagekräftige Namen: "mainsaveverzeichnis" ist recht nichtssagend.
- Wenn du etwas mit print ausgibst, dann solltest du die einzelnen Strings einfach durch Kommas trennen, eine Konkatenation per + ist überflüssig. Wenn du komplexere Ausgaben haben willst, dann kannst du auch String-Formatting verwenden.
- Der wichtigste Punkte von allen: Verwende niemals ein except, ohne dass du den Fehler angibst, welcher abgefangen werden sollen. Sonst werden nämlich wirklich alle Ausnahmen abgefangen, was eine Fehlersuche nahezu unmöglich macht. Passe das am besten als erstes an, vielleicht löst sich dein Fehler dann auch schon von ganz alleine auf.
- Zeile 17 kannst du dir sparen, wenn du das Ergebnis in Zeile 13 bereits an einen Namen bindest. Deine aktuelle Implementierung ist sogar Fehlerhaft, da Zeile 13 noch funktionieren kann, bei Zeile 17 das Verzeichnis aber schon nicht mehr existiert. Selbiges weiter unten noch einmal.
- Du setzt sehr viele Pfade mehrfach zusammen und hast recht viel Codeduplikation, das solltest du auf jeden Fall loswerden. Zum zusammensetzen von Pfaden benutze os.path.join, damit bis du OS-unabhängig und kürzer/lesbarer ist es auch noch.
- r"/" ist das selbe wie "/".
- Was bezweckst du mit Zeile 68? Wenn Zeile 64 schon funktioniert hat, dann musst du das kopieren nicht noch einmal machen. Vielleicht einmal zur Erklärung: der try-Block sagt dir nicht, ob etwas ausgeführt werden kann, sondern führt es aus und liefert bei einem Fehler eine Ausnahme.
- Die letzte Zeile sollte noch durch einen "if __name__ == '__main__'"-Guard geschützt werden, damit du dein Modul auch importieren kannst.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
wislak
User
Beiträge: 2
Registriert: Donnerstag 25. Februar 2010, 18:09

hallo danke für deine tipps.
Bin immer dankbar wenn ich meinen code verbessern kann.
Anbei meine Überarbeitung. Das mit den ausagekräftigen Namen hab ich noch nicht ganz heraus, :D
Das Problem besteht leider weiterhin....
nur das sich das Verzeichnis geändert hat...
/sys/kernel/debug/usb/usbmon/5s

Mit das Programm stoppt meine ich, dass das Programm ausgeführt wird und sobald das Verzeichnis erreicht wird, stoppt das programm. Es erscheint kein fehler und das Programm wird auch nicht beendet. Aber es erscheinen auch keine Ausgaben mehr das noch Dateien kopiert werden.

Kann es sein das der Speicher volläuft??
Danke für alle Antworten :D

Code: Alles auswählen

import os
import time
import shutil

backupdirectory= r'/home/reini/Desktop/Backup'
maindirectory = r'/'

def get_directory(path,backuppath):

	try:
		directorys= os.listdir(path)
	except OSError:
		print "Auf Pfad"+path+"kann nicht zugegriffen werden"
	else:
		for line in directorys:
			currentobject=os.path.join(path,line)
			backupobject=os.path.join(backuppath,line)
			try:
				os.path.isdir(currentobject)
			except OSError:
				print "Auf Pfad",currentobject,"kann nicht zugegriffen werden"
			else:
				link=0
				if os.path.isdir(currentobject):
					link=check_directory(backupobject,currentobject)
					if link == 1:
						get_directory(currentobject,backupobject)
				elif os.path.isfile(currentobject):
					check_file(currentobject,backuppath,line)
def check_directory(backuppath,filepath):


	try:
		os.readlink(filepath)
	except OSError:
		if os.path.isdir(backuppath):
			print"-----------------------"
		else:
			os.mkdir(backuppath)
		return 1
	else:
		print backuppath," ist ein link"
		
def check_file(file,backupdirectory,backupfile):

	backuppath=os.path.join(backupdirectory,backupfile)
	if os.path.isfile(backupdirectory+r'/'+backupfile):
		filemodtime=os.path.getmtime(file)
		backupmodtime=os.path.getmtime(backuppath)
		if filemodtime < backupmodtime:
			print backupfile," ist aktuell"
		else:
			try:
				shutil.copy(file,backuppath)
			except IOError:
				print "fehler beim kopieren der datei",backupfile
			else:
				print backupfile," wurde kopiert"
	else:
		try:
			shutil.copy(file,backuppath)
		except IOError:
			print "fehler beim erstellen der datei",backupfile
		else:
			print file, " wurde erstellt"		



if __name__ == '__main__':
	get_directory(maindirectory,backupdirectory)
	
Antworten