print-problem o.O

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

guten morgen,
so ihr lieben :) hier mein Code:

Code: Alles auswählen

#!/bin/bash
#!/bin/sh
#! /usr/bin/env python

import time
import os
from time import *
lt = localtime()
print strftime("%d.%m.%Y", lt)

while 1:
 datei = open ("test.ini","r")
 Zeile = datei.readlines()
 host=Zeile[1].strip().split(" ")[1]
 datei.close()
 print host
else: #<~ break
     print 'Fehler'
if host< lt :
 print 'Sicherung wird gestartet'
 execfile('/mnt/Freigaben/00-16-17-15-56-61/client.py')
else:
 print 'Fehler'
~

mein Fehler liegt nun darin das print host immer ausgegeben wird und er meine While-Schleife nicht mehr verlässt mit einem break anstatt else zeigt er mir an: break
SyntaxError: 'break' outside loop
jemand vll ne Idee was ich an meiner schleife falsch gemacht habe? würde mir sehr helfen. Danke für alles

lg Bluelagoon
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Die Fehlermeldung sagt's doch: 'break' outside loop. Das break gehoert in die While-Schleife, nicht dahinter. Lies dir mal den entsprechenden Abschnitt im Tutorial durch.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

wie kann es nicht in einer while schleife sein wenn es im selben block ist? das is das was ich nicht versteh -.-
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Das erste else ist nicht im while-Block, da es nicht eingerueckt ist.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

achso jetz hab ichs kapiert weil ich es um ein Leerzeichen falsch eingerückt hab :D Joa Rebbeca danke habs grad selbst rausgefunden wuhu :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bluelagoon hat geschrieben:wie kann es nicht in einer while schleife sein wenn es im selben block ist? das is das was ich nicht versteh -.-
Ich sehe in dem Code überhaupt kein break. Vielleicht solltest du mal den tatsächlich verwendeten Code und die echte Fehlermeldung hier angeben.

Es wäre übrigens sinnvoll, wenn du PEP-8 einhalten würdest. So wie er jetzt ist, ist der Code nicht gerade gut zu lesen.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

/me ich hab else mit break ausgetauscht und das break dann als Kommentar stehn lassen also dort wo else stand stand break.
BlackJack

@bluelagoon: Mal abgesehen von der Syntax verstehe ich nicht so recht was die ``while``-Schleife da überhaupt bewirken soll. So ein komisches, sinnloses Konstrukt -- "Endlos"-``while``-Schleife die am Ende durch ein unbedingtes ``break`` beendet wird -- habe ich in einem Deiner Quelltexte hier IIRC schon einmal gesehen.

Davon abgesehen solltest Du mehr Mühe auf die Formatierung und die Namensgebung verwenden. Pro Ebene wird üblicherweise vier Leerzeichen eingerückt. `lt` ist als Name zu kurz und nichtssagend. `Zeile` wird nicht an *eine* Zeile gebunden sondern an *mehrere* Zeilen. Bei dem Namen `host` vermutet man nicht unbedingt, dass da ein Zeitwert dran gebunden wird.

Endlosschleifen, wenn sie denn Sinn machen, sind IMHO verständlicher wenn man sie mit einem Wahrheitswert statt einer Zahl schreibt. Also ``while True:``.

Und Du hast da einen Typfehler drin. Schau Dir mal an was für Typen `host` und `lt` haben und ob es Sinn macht die auf ``<`` zu Vergleichen.

Mir scheint Du betreibst "programming by accident" und tauscht relativ wahllos solange irgendwas aus oder um bis es (scheinbar) läuft. Das ist keine gute Idee und kein richtiges Programmieren.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

#!/bin/bash
#!/bin/sh
import time
import os
from time import *
lt = localtime()
print strftime("%d.%m.%Y", lt)

while 1:
 datei = open ("test.ini","r")
 Zeile = datei.readlines()
 Zeit=Zeile[1].strip().split(" ")[1]
 datei.close()
 print zeit
 break

if zeit< lt :
    print 'Sicherung wird gestartet'
    execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_client.py')
else:
    print 'Fehler'
~
für dich ausgetauschte Variable aber lt wird nicht ausgetauscht das heisst localtime und bleibt auch so, unter anderem: ich kann die Lokalzeit NICHT mit einem Datum von 24.04.2008 vergleichen deshalb < weil er mir sonst in meinem Sicherungsskript vom 24.04.2008 bis jetzt die Daten nicht sichert, sondern alles er soll nur die Daten von da bis jetzt sichern deswegen < gut das Beispiel 2008 is krass aber sagen wir 24.04.2010 das sind 5 Monate da mach ich keine Vollsicherung sondern sichere alle neuen Daten zu meiner Vollsicherung hinzu.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

das einzige was jetz noch mein Problem is wie "Filtere" ich einen einzigen Buchstaben aus einer Datei zum Beispiel:

Variable= 5D das ich nur die 5 bekomm denn durch die Zahlen löse ich eine Aktion aus und das D kann ich dazu nicht gebrauchen.
Wenn mir jemand helfen kann wäre ich demjenigen Sehr Dankbar.

lg Bluelagoon
BlackJack

@bluelagoon: Ich sehe da einen `NameError` bei `zeit`. Das würde nicht passieren wenn Du Dich an die üblichen Namenskonventionen halten würdest.

Mir ist schon klar was Du mit dem ``<`` erreichen wolltest, aber das funktioniert so nicht, weil Du inkompatible Datentypen miteinander vergleichst. `localtime()` liefert eine ganze Zahl und aus der Datei bekommst Du eine Zeichenkette. Da kommt völlig unabhängig von den tatsächlichen Werten *immer* das gleiche Ergebnis bei dem Vergleich heraus:

Code: Alles auswählen

In [734]: '42' < 23
Out[734]: False

In [735]: '23' < 42
Out[735]: False
Es kann sein, dass bei Dir dort immer `True` herauskommt, dass dann aber auch konsequent *immer*.

Die ``while``-Schleife ist so auch immer noch total sinnfrei. Was soll die bewirken? Was hast Du Dir dabei gedacht?

Warum steht das 'D' dort wenn Du es nicht gebrauchen kannst? Das könnte man zum Beispiel mit einem regulären Ausdruck lösen (`re`-Modul).
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

das D steht dort weil das vom Server Rechner aus eine Variable geschrieben wird
server sagt Variable 8Y und ich brauch dann die Zahl 8 ich hab Zeit in dem einen falsch geschrieben einma Groß un einma klein, das hab ich im Nachhinein entdeckt. die While schleife schmeiss ich raus weil ich nur Datei öffnen Lesen splitten bestimmten Zahl raussuchen muss der Server schreibt das Datum der letzten Sicherung in die Datei nicht ich. das die lokalzeit die jetzige zeit ist Ist mir irgendwo schon klar nur wie soll ich das deiner meinung nach SONST anstellen ich hör immer nur Kritik Kritik.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

es ist auch so das NICHT immer das Datum dort steht und das dann auch NICHT ausgeführt wird. es soll nur ausgeführt werden wenn der der am server sitzt sagt

variable= 8Y 23.04.2010


nur als Beispiel von daher wenn ich == oder < schreib is das gleich meiner Meinung nach.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

#!/bin/bash
#!/bin/sh
import time
import os
from time import *
lt = localtime()
print strftime("%d.%m.%Y", lt)
datei = open ("test.ini","r")
Zeile = datei.readlines()
Zeit=Zeile[1].strip().split(" ")[1]
datei.close()

if not  Zeit == lt :
    print 'Sicherung wird gestartet'
    execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_client.py')
else:
    print 'Fehler'
~

so sieht meine Datei jetzt aus. und jetz sag nich das ich wieder rumexperimentiert hab weil if not ich noch aus vb.net kenne :). jetz brauch ich halt nur für die andere Datei das so schreiben das nur 5 ausgelesen wird zb. ich poste mal den code der zweiten Datei:


Code: Alles auswählen

 
#! /usr/bin/env python
import linecache
import sys, dbus
import os
import time
import subprocess
auswahl = 5  #<~ Dieses Auswahl kommt weg das war nur Versuchszweck. 
datei = open ("dp_clienttask.ini","r")
Zeile = datei.readlines()
auswahlen=Zeile[1].strip().split("=")[1]
datei.close()
print auswahlen


if auswahl == 4 : #und bei jeder "Auswahl kommt auswaehlen hin!
    outfile=open("dp_clienttask.ini","w+")
    for line in open("dp_clienttasktemp.ini"):
        line=line.replace ("X","5")
        outfile.write(line)
        print line
    outfile.close()

elif auswahl == 5 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
    quellen = ['/home/davidlinux/',]
    ziel_verzeichnis = '/etc/dp/Backup'
    heute = ziel_verzeichnis + time.strftime('%Y%m%d')
    jetzt = time.strftime('%H%M%S')
    print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
    print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

#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 -czf %s %s' % (ziel, ' '.join(quellen))
    os.system(tar_befehl)
    tar_befehle = 'tar -uf /etc/dp/Backups'
    os.system(tar_befehle)


# Sicherung starten
    try:
        while True:
            exitstatus=os.system(tar_befehl)
            if exitstatus == 0:
                print 'Erfolgreiche Sicherung nach "%s"' % ziel
            else:
                print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
                ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
                print 'Sicherung abgebrochen'
            break
    except KeyboardInterrupt:
        print "Sicherung beendet"


elif auswahl == 2 :
 def shutdown():
    bus = dbus.SystemBus()
    try:
        remote_object = bus.get_object('org.freedesktop.Hal',
                                    '/org/freedesktop/Hal/devices/computer')
        props = remote_object.Shutdown(dbus_interface='org.freedesktop.Hal.Device.SystemPowerManagement')
    except dbus.exceptions.DBusException, e:
        print e

 if __name__ == "__main__":
    shutdown()
und in der zweiten Datei die ich grad gepostet hab die wird die Variable mit der Zahl 5 z.B. auslesen.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Kurze zwischenfrage: Was soll das eigentlich in deinem Code:

Code: Alles auswählen

#!/bin/bash
#!/bin/sh
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ja das wollte ich eig noch löschen hm danke für info.
BlackJack

@bluelagoon: Also einige Sätze von Dir kann ich überhaupt nicht verstehen. Die sind einfach nur wirr.

Ein ``==`` statt eines ``<`` ändert nichts daran, dass Du da inkompatible Typen miteinander vergleichst:

Code: Alles auswählen

In [736]: not '23' == 42
Out[736]: True

In [737]: not '42' == 42
Out[737]: True
Eine Zeichenkette wird *immer* ungleich einer ganzen Zahl sein, völlig unabhängig von den konkreten Werten. Der ``else``-Zweig dort wird *niemals* ausgeführt werden.

Statt des ``not`` könnte man hier übrigens tatsächlich ``!=`` als Vergleichsoperator verwenden.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

BlackJack es geht nur darum das dieses Skript ausgeführt wird WENN ein datum drin steht sonst wird dieses skript nicht ausgeführt ^^ wenn dort steht 5 D ewig nix,
dann wird auch nix gemacht nur wenn dort steht 5D 23.04.2010 dann wird gesichert :).
und dann muss localtime bis zu dem 23.04.2010 sichern.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

mir is schon iwo klar das int un string 2 verschiedene Daten sind aber wie soll ich ein Datum umwandeln in string?-.-
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Mit strftime kann eine Zeittupel in einen String formatiert werden.

das hab ich auch gemacht.

hinzugefügt:
lt = localtime()
str(strftime("%d.%m.%Y", lt))
print strftime("%d.%m.%Y", lt)

lieg ich jetzt immer noch falsch oder hab ichs nun richtig formatiert x.x
Antworten