Sicherungsskript von a byte of python

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.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

hey ihr Lieben,
ihr kennt doch sicher dieses Skript von dem Buch das is echt eine Tolle Anwendung aber ich möchte die erweitern . Und zwar ich will nicht STRG und C drücken wenn ich es stoppen will sondern hab eine Variable die heisst Zahl und wenn 0 steht wird gesichert und wenn 1 drinsteht soll er Sicherung abbrechen. Irgendwie, bin ich mit meinem Latein am Ende denn, es kommt egal was ich eingeb die Sicherung . Vielleicht hat einer von euch eine Idee.

http://abop-german.berlios.de/read/the- ... #id2563292 der Link vom Skript nur das ich drüber stehn hab Zahl= 1

Für alle Lösungsvorschläge wäre ich euch sehr dankbar.

Mit freundlichen Grüßen
Bluelagoon
Benutzeravatar
noisefloor
User
Beiträge: 3860
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie und wo hast du denn eine 0 stehen? Ein bisschen Code wäre hilfreich...

Gruß, noisefloor
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

L == 0

elif L == 0 :
#  Die Dateien und Verzeichnisse, die gesichert werden sollen,
    quellen = ['/home/conrad/',]
    ziel_verzeichnis = '/home/Eva/Backup'
    heute = ziel_verzeichnis + time.strftime('%Y%m%d')
    jetzt = time.strftime('%H%M%S')
#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
    if not os.path.exists(heute):
        os.mkdir(heute) # erzeuge das Verzeichnis
        print 'Verzeichnis' , heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
    ziel = heute + os.sep + jetzt + '.tar'
    tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
    
# Sicherung starten

    if os.system(tar_befehl) == 0:
        print 'Erfolgreiche Sicherung nach', ziel
    elif os.system(tar_befehl) == 1:
        print 'Sicherung fehlgeschlagen!'
    else:
        print 'Sicherung Beendet'
das is der Abschnitt der nicht so 100 pro funktioniert ^^
Zuletzt geändert von bluelagoon am Mittwoch 8. September 2010, 11:56, insgesamt 1-mal geändert.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

das heisst öhm das is der Teil der funktioniert nur ich muss die funktion Nochmal schreiben falls das L sich zu 1 ändert das die Sicherung gestoppt wird.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hui, da weiß man gar nicht, wo man anfangen soll...

- "L" ist kein guter Name. Wofür steht denn "L"? Weißt Du das auch noch in ein paar Wochen? Wähle besser aussagekräftige Namen.

- Pfade setzt man mit os.path.join() zusammen

- vergiss os.system() und nutze das subprocess-Modul!

- Die Vergleiche auf kann man schöner lösen:

Code: Alles auswählen

In [1]: n = 0

In [2]: if n:
   ...:     True
   ...:     

In [4]: if not n:
   ...:     True
   ...:     
   ...:     
Out[4]: True

In [5]: 0 == False
Out[5]: True
Tja, ansonsten würde ich sicherlich versuchen, alle festen Pfade vorher an Namen zu binden, um das ganze universeller und konfigurierbar zu gestalten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja ich hab über L stehn das das einfach ne Variable is ich arbeite im Kompletten Skript nur mit der Variable L und wenn dort bestimmte Zahlen stehn soll einfach was ausgeführt werden hab das skript von der internetseite

http://abop-german.berlios.de/read/the- ... #id2563292

und halt drüber ne Schleife gebaut und nun wil ich dasselbe Skript kopieren mit dem Unterschied das dort steht : Sicherung wurde abgebrochen statt dem "Sicherung erfolgreich" ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bluelagoon hat geschrieben:naja ich hab über L stehn das das einfach ne Variable is ich arbeite im Kompletten Skript nur mit der Variable L und wenn dort bestimmte Zahlen stehn soll einfach was ausgeführt werden hab das skript von der internetseite
Alleine Deine "Rechtfertigung" dafür klingt obskur ;-) Beherzige doch einfach die Tipps - schließlich willst Du doch wohl was lernen oder nicht?

Und nur weil die Lösung auf einer Internetseite gepostet ist, muss sie nicht gut sein ;-)

Zumal sämtlicher Code auf Modulebene steht - das ist schon mal kein gutes Zeichen idR.

In Deinem Ausgangsposting schriebst Du etwas von dem Namen "Zahl". Den sehe ich in Deinem Code gar nicht.
Von einer Schleife ganz zu schweigen...

Was genau willst Du denn erreichen? Evtl. solltest Du noch mal mehr von Deiner Schleifenkonstruktion posten?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja ich find ja neues gut und so aber möchts halt möglichst relativ schnell lösen

Code: Alles auswählen

#usr/bin/pyton
import linecache
import sys, dbus
import os
import time

#L ist eine Variable in der, der Wert steht.
L = 0

if L == 4 :
  outfile=open("geschichten.txt","w+")
  for line in open("geschichten.txt"):
      line=line.replace ("X","Y")
      outfile.write(line)
      print line
  outfile.close()

elif L == 0 :
#  Die Dateien und Verzeichnisse, die gesichert werden sollen,
    quellen = ['/home/conrad/',]
    ziel_verzeichnis = '/home/Eva/Backup'
    heute = ziel_verzeichnis + time.strftime('%Y%m%d')
    jetzt = time.strftime('%H%M%S')


#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
    if not os.path.exists(heute):
        os.mkdir(heute) # erzeuge das Verzeichnis
        print 'Verzeichnis' , heute, 'erfolgreich angelegt'


# Der Name der Tar-Datei:
    ziel = heute + os.sep + jetzt + '.tar'
    tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
# Sicherung starten

    if os.system(tar_befehl) == 0:
        print 'Erfolgreiche Sicherung nach', ziel
    elif os.system(tar_befehl) == 1:
        print 'Sicherung fehlgeschlagen!'
    else:
        print 'Sicherung Beendet'

so ^^ ich hoff es ist irgendwie nun klarer geworden das ist halt nur ein Versuch möchte austesten ob das was ich in vb.net umsetzen kann mit Python auch so umsetzen lässt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nö. Du klatscht ja nur den Quellcode hin, ohne zu beschreiben,

a.) was Du erreichen willst,
b.) was tatsächlich passiert,
c.) wo Du einen Unterschied zwischen Ziel und Ist-zustand des Scriptes siehst.

Du solltest doch wohl leicht sehen, dass Du den Wert 0 an "L" bindest (der Name ist und bleibt doof - zumal er gegen PEP8 verstößt und damit schon mal "l" heißen müßte, was fast noch doofer ist, weil man es leicht mit "I" oder 1 verwechseln könnte.), danach auf den Wert 4 testest. Woher sollte "L" denn einen anderen Wert bekommen? Von außen wird dem Modul ja auch nichts übergeben...

Da Du ja aber eben nichts über Deine Zielsetzung schreibst (s.o.), kann man Dir so lange nicht weiterhelfen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Sonnigen Guten Morgen,
also ich Beschreib mal:
Hyperion ok!Dann änder ich den Buchstaben L um als l jedenfalls.. diesen Wert übergeb ich selbst und führ es aus je nachdem was dann drinsteht durchläuft er die Schleife und führt dementsprechend aus. Mein Ziel ist wenn l nen wert von 0-4 bekommt etwas ausführt wie zum Beispiel runterfahren oder Zeilen in einer Datei ändern oder Sicherung von mir auf meiner Frau ihrer Partition zu spielen.Und wenn ein anderer Wert drin steht die Sicherung zu stoppen bzw gar nicht erst anzufangen.

Ich seh das Ziel so es wird erst mit l versucht und danach an eine Datei gebunden deren Wert sich immer ändern wird es ist nur zum Test bis das alles funktioniert der Wert l. Denn mit der Sache will ich mich später beschäftigen ist für mich auch irgendwie einfacher.
Naja das Problem ist einfach das der Benutzer später ja evtl. nicht weis das er STRG+C drücken soll um das umzusetzen. Wenn ich schreib print 'strg +c bricht Sicherung ab' sieht das kein Mensch weil Tar alles auflistet.Deswegen will ich einen Wert geben und die spätere Datei ändert sich auch ca alle Minuten.

Auf Anhieb wüsste ich jetzt nicht wie ich die Sicherung im laufenden Betrieb sonst unterbrechen soll.
Auf Windows-Ebene mit VB.Net wäre das wesentlich einfacher. Möchte eben nur das aufbauen für unsere Firma.

Liebe Grüße

Bluelagoon
Benutzeravatar
noisefloor
User
Beiträge: 3860
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn ich dein Problem richtig verstehe ;-) solltest du dein Programm in Funktionen unterteilen und nicht linear durchlaufen lassen. Dadurch kannst du nur die Funktionen aufrufen, die brauchst und muss nichts abbrechen, was eigentlich gar nicht laufen sollte.

Bzgl. der Variablenübergabe von außen: Übergib' die Variabel doch beim Programmaufruf und übergib' für jede "Aktion" eine eigene Variabel, also z.B.

Code: Alles auswählen

python mein_skript.py sicherung=true shutdown=false
Die Aufrufe kannst du dann mit argv aus dem sys-Modul auswerten.

Gruß, noisefloor
Zuletzt geändert von noisefloor am Donnerstag 9. September 2010, 13:28, insgesamt 1-mal geändert.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja das Problem ist meine Frau will das nicht so.Und mach mal einer etwas Histerischen Frau das klar :twisted:
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

einer vll sonst ne Idee wie ich die laufende Sicherung evtl unterbrechen könnte?
Danke für eure Hilfe
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ja, arbeite mal das Python-Tutorial durch, vielleicht verstehst du dann, was du da tust.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja ich werd mal andere variablen schreiben und ich weis was mein Programm da tut, sonst hätt ich das nicht so dort stehn.Ich seh halt nur das er die Sicherung mit strg und C abbricht vll bau ich einfach ne while schleife drüber un passt.
BlackJack

@bluelagoon: Eine laufende Sicherung in der Textkonsole abzubrechen dürfte Deine jetzigen Fähigkeiten übersteigen. Dazu müsstest Du ja irgendwie Benutzereingaben entgegen nehmen und die Sicherung *gleichzeitig* durchführen. Ausserdem müsstest Du entweder dafür sorgen, dass `tar` "ruhig" ist, oder die ganzen Ausgaben irgendwohin umleiten, denn wie Du schon richtig angemerkt hat, stören die Ausgaben die Kommunikation mit dem Benutzer. Du müsstest Dich also mit Threads und Prozessen sowie deren Standardkanälen beschäftigen. Und das wo Du offensichtlich schon grundlegende Probleme mit der Organisation des Quelltextextes und einfacher Ablauflogik hast, die nicht einmal etwas mit der Programmiersprache zu tun haben. Das ist in jeder imperativen Programmiersprache gleich, also auch in VB.

Du solltest erst einmal aufhören alles auf Modulebene zu schreiben und die einzelnen Funktionalitäten in Funktionen aufzuteilen, die dann entsprechend der eingegebenen Zahl aufgerufen werden. Den Namen `l` sollte man dafür vielleicht in `choice` oder `auswahl` ändern, damit er die Bedeutung des Wertes, der daran gebunden wird widerspiegelt. Das ist nichts was man auf ein nebulöses "Später" verschieben sollte.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

standartkanal jaaa genau warum bin ich nicht gleich drauf gekommen :!:
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

vielen vielen dank ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Es heißt Standard ;-)

Ich denke auch, dass Du es falsch angehst. BJ hat Dir ja schon erklärt, auf was für Probleme Du da stoßen wirst. Imho hat noisefloor Dir doch einen guten Tipp gegeben, den ich hier mal ein wenig abgewandelt aufbohren werde:

http://paste.pocoo.org/show/259836/

Hier mal testweise einige Aufrufe:

Code: Alles auswählen

nelson@MECL-LAP3:~/src/Python/Snippets$ ./dispatcher.py 

        Benutzung des dollen Scriptes:
        
        ./script.py PARAMS

        PARAMS:
            - backup: sichert irgendwas
            - foo: macht auch was tolles
    
nelson@MECL-LAP3:~/src/Python/Snippets$ ./dispatcher.py foo back backup
Bin in bar :-)
Das Kommando 'back' gibt es nicht!
Fertisch!
Natürlich sollte man für komplexere Dinge einen Kommandozeilen-Parser benutzen (was schon erwähnt wurde) und Nebenläufigkeiten bietet das auch noch nicht. Aber für einen Anfänger ist das sicherlich schon mal ein (durchaus machbarer) Brocken, alle Konzepte dahinter zu kapieren. Gleichzeitig hat man im Gegenzug aber auch was funktionierendes ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja das stimmt schon sorry das ich mich verschrieben habe. Jedenfalls ich weis das meine Sicherung in ein Tar gepackt wird und die Idee in Standartkanal auszuleiten ist ne gute Idee. Danke für den Link aber es bringt sehr viel das dort steht. FOO macht irgendwas is dazu natürlich ne tolle Sache. Naja ich probier weiter meine kleine große Hürde :D
Antworten