Type error python sicherung bricht ab

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

Moin,
nun hab ich das mit den arrays umgesetzt und bekomme nun folgenden Fehler:
TypeError: coercing to Unicode: need string or buffer, list found
die Zeilen die angemeckert werden sind folgende
File "C:\Python26\lib\threading.py line 532 in __bootstrap__inner self.run()
line 484 in run
self.__target
file latest.py line 281 in backup
raise e

in der file die Zeile 281 sieht so aus:

Code: Alles auswählen

print self.allexcludes
        tar = None
        try:
            if not os.path.exists(os.path.dirname(self.current_archive)):
                os.makedirs(os.path.dirname(self.current_archive))
            tar = tarfile.open(self.current_archive, 'w:bz2')
            for directory in self.sources:
                os.path.walk(directory, self.add_file, (tar, since_date))
            print >> sys.stderr,'Backup to archive "%s" complete.' % self.current_archive
        except OSError:
            print >> sys.stderr, '''Backup aborted because file "%s" couldn't be written.''' % self.current_archive
            pass
        except IOError:
            print >> sys.stderr, '''Backup aborted because file "%s" couldn't be written.''' % self.current_archive
            pass
        except Exception, e:
            if e.args == ('Stopping backup!', ):
                print >> sys.stdout, 'Backup aborted as told by configuration file %s.' % self.config_file
            else:
                raise e
        finally:
            if tar != None and not tar.closed:
                try:
                    tar.close()
                except Exception, e:
                    pass
        self.backup_thread = None
raise e ist die Zeile 281.
self.allexcludes wurde später definiert mit excludes
und gibt nun die richtigen Dateien aus dem array heraus.
kann mir jemand erklären warum ich nun diesen TypeError bekomme?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tja, es wäre einfacher zu erklären - und damit auch zu debuggen -, wenn du nicht soviel in den `try...except`-Block packen würdest. Idealerweise "umrahmt" man damit exakt einen Aufruf. Jetzt wirst du wohl schrittweise herausfinden müssen, an welcher Stelle eine Liste statt einer Zeichenkette übergeben wird. Ich glaube auch kaum, dass der Fehler etwas mit deinem `allexcludes` zu tun hat, denn dies wird kommt innerhalb des Blocks für die `if`-Anweisung ja gar nicht zum Einsatz. Ich würde an deiner Stelle mal prüfen, was in `self.current_archive` steckt.
Zuletzt geändert von snafu am Montag 25. Juli 2011, 08:25, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ein Blick in die Dokumentation sollte dir erklären wie man raise verwendet: http://docs.python.org/tutorial/errors. ... exceptions
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sparrow hat geschrieben:Ein Blick in die Dokumentation sollte dir erklären wie man raise verwendet: http://docs.python.org/tutorial/errors. ... exceptions
Das trägt aber nicht wirklich zur Lösung des Problems bei. ;)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

also im self.current_archiv kanns net liegen weil das is der netzwerkpfad mit ordnername und tar-name
der Fehler kommt auch erst seit excludes aus Datei in array gelesen wird

ich poste mal weiter oben

Code: Alles auswählen

excludes_file_list='dp_excludes.ini'
exclude_file=open(excludes_file_list)
excludesList = []
for exclude_line in exclude_file.readlines():
                if exclude_line.lower().strip().startswith("excludes"):
						exclude = re.split('^excludes\s*=\s*', exclude_line.lower().strip())[1]
excludesList.append(exclude)
excludes= excludesList
print excludes
dp_source_file = open(source_file_list)
sources_data=[]
for lines in dp_source_file.readlines():
    if lines.lower().strip().startswith("sources"):
         source = [re.split('^sources\s*=', lines.lower().strip())[1]]
sources_data.append(source)	
sources=sources_data
self.allexcludes = [os.path.normcase(os.path.abspath(exclude)) for source in self.sources for exclude in self.excludes]
die Zeile sah vorher so aus und hat immer gemeckert nu geändert in
self.allexcludes= excludes
meckert der eben den Fehler :D




Interessant

Code: Alles auswählen

excludes = ['C:\\Windows\\', 'C:\\Temp\\' , 'C:\\TMP\\', 'C:\\$recycle.bin', 'C:\\PerfLogs','C:\\Python26\\david-neu','C:\\SYSINFO', 'C:\\SUPPORT\\','c:\\dokumente und einstellungen\\', 'c:\\recycled','c:\\python26\\','C:\\ATI','C:\\python31\\']
#excludes_file_list='dp_excludes.ini'
#exclude_file=open(excludes_file_list)
#excludesList = []
#for exclude_line in exclude_file.readlines():
 #               if exclude_line.lower().strip().startswith("excludes"):
#						exclude = re.split('^excludes\s*=\s*', exclude_line.lower().strip())[1]
#excludesList.append(exclude)
#excludes= excludesList
#print excludes
dp_source_file = open(source_file_list)
for lines in dp_source_file.readlines():
    if lines.lower().strip().startswith("sources"):
         sources = re.split('^sources\s*=', lines.lower().strip())[1]
#sources_data.append(source)	
#sources=sources_data	

sprich alles was auskommentiert is erzeugt diesen Fehler inclusive
self.allexcludes = [os.path.normcase(os.path.abspath(exclude)) for source in self.sources for exclude in self.excludes]

hab ich am array vll etwas falsch gemacht?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

snafu hat geschrieben:Das trägt aber nicht wirklich zur Lösung des Problems bei. ;)
Ooooch, ich finde schon. Männo.

Dann halt auf dem Silbertablett:
Wenn man einen Fehler mit raise nach oben weiter reicht steht das raise natürlich als letztes im Stacktrace...
Das heißt aber nicht, dass da der Fehler aufgetreten ist.
Interessant ist also eher was hier steht: line 484 in run self.__target
Wobei das natürlich ein Python-Standard-Modul ist dem offensichtlich falsche Daten zugefüttert werden.

Oder sehe ich das falsch?

Gruß
Sparrow

Edit:

Code: Alles auswählen

def test(a):
    try:
        return a / 2
    except TypeError, e:
        print "Fehler"
        raise e

print test(6)
print test('qwertz'):
bringt:

Code: Alles auswählen

6
Fehler
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    test('qwertz')
  File "test.py", line 6, in test
    raise e
TypeError: unsupported operand type(s) for /: 'str' and 'int'
gnarf, über Tippfehler bitte ich hinweg zu sehen, irgenwie habe ich mir gerade die Zwischenablage kaputt gespielt.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ja ich denke auch das meine excludes und sources mit dem array nicht passen deshalb hätt ich gern ne Berichtigung ob das stimmt oder ob ich da was falsch habe und wie ich self.allexcludes umbauen muss


die Datei sieht so aus:
excludes= C:\Windows\
excludes= C:\Temp\
hab grad nur 2 pfade angegeben.
so die Zeile:
exclude = [re.split('^excludes\s*=\s*', exclude_line.lower().strip())[1]]
ich wusste es das irgendwo oben die Fehler sein müssen.
Fehlermeldung das self.allexcludes nicht passt
typeError
ich bin irgendwo am Ende von meinem Latein grade.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Anweisung zum Anfügen eines Elements an die Liste sollte schon innerhalb der `for`-Schleife passieren. Andernfalls wird die gesamte `for`-Schleife durchlaufen und das zuletzt gebunde Element ans Ende der Liste gefügt. Quasi das selbe wie beim letzten Mal, nur diesmal in grün. ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sparrow hat geschrieben:Wenn man einen Fehler mit raise nach oben weiter reicht steht das raise natürlich als letztes im Stacktrace...
Das heißt aber nicht, dass da der Fehler aufgetreten ist.
Ach, das wolltest du sagen. Ich hatte es eigentlich als bekannt voraus gesetzt, dass man sich im Klaren darüber ist, dass die Ursache eines Fehlers nicht unbedingt in der Zeile liegen muss, wo der Fehler auftritt.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Kommt das nicht drauf an wie ich die 'Liste' aufbau?
wenn ich jeden Wert einzeln schreibe wie z.b.
excludes= C:\Windows
excludes= C:\TMP
dann nimmt er auch nur C:\TMP wenn ich nun alles in eine einzige Zeile füge kommen die Ordner raus aber er ignoriert z.B C:\Windows und sichert diesen mit.

Code: Alles auswählen

for exclude_line in exclude_file.readlines():
                if exclude_line.lower().strip().startswith("excludes"):
						excludesList = []
						exclude = re.split('^excludes\s*=\s*', exclude_line.lower().strip())[1]
						excludesList.append(exclude)
						excludes= excludesList
print excludes
excludelist:
excludes= C:\Windows\ , C:\Temp\
ausgabe:
['C:\Windows\ , C:\TMP\']
mich überkommt immer das Gefühl das hier der Fehler liegen muss :/
BlackJack

@bluelagoon: Da liegt in der Tat ein Fehler. Aber ausser Dir den Quelltext zu schreiben, sehe ich echt nicht, wie „Du” ein Programm zustande bekommst. Ich sage Dir jetzt zum 100. mal, mach Dir klar was da passiert. Überlege für jede Anweisung und jeden Teilausdruck was Du erwartest, was hinterher an welchen Namen gebunden ist, und dann überprüfe diese Erwartung mit dem was tatsächlich passiert. Dann findest Du heraus wo es nicht das tut was Du gerne hättest.

Wenn Du nicht darauf kommst, was Du anders machen musst, kann man Dir ja helfen, aber ich erwarte schon, dass Du zumindest mal selber die Stelle findest und auch in zusammenhängenden Sätzen strukturiert beschreibst wo die Wirklichkeit von Deinen Erwartungen abweicht. Denn sonst hilft Dir eine Erklärung was falsch ist, nicht weiter, weil Du sie nicht verstehst.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Natürlich liegt dort der Fehler. Es wird halt ein String erwartet und keine einelementrige Liste, in der ein String ist. Stell zudem mal bitte die Einrückung in deinem Editor um. Dein Code ist in dieser Form kaum zu lesen. Empfohlen werden eigentlich 4 Leerzeichen.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

aber wie soll ich die Liste dann umbauen?
wenn ich jede Zeile exclude nenne wirft er auch Fehler :/
ja ich stells bei Notepad um danke für den Hinweis.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Liste außerhalb der `for`-Schleife erstellen, Anfügen innerhalb der `for`-Schleife. Alles andere macht wohl wenig Sinn. Mach dir klar, dass alles innerhalb einer Schleife solange ausgeführt wird bis das `for`-Statement nichts mehr zum Binden hat, in diesem Fall also die letzte Zeile durchlaufen wurde. Alle verwendeten Namen werden bei jedem Durchlauf neu erstellt bzw überschrieben. Es wird also jedes Mal eine neue leere Liste an den Namen gebunden und in diese Liste wird exakt *ein* - nämlich das jeweils aktuelle Element - eingefügt. All das überschreibt der nächste Durchlauf aber dann wieder. :)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ah stimmt hab das obere List übersehn danke nun landet nur trotzdem alles in der Sicherung.
diese scheiss excludes regen mich auf :evil:
die Ausgabe an sich ist nun richtig.
ich übergib später exclesList an excludes zurück und sieh an.. er ignoriert die Liste wieder ..
kann man nicht dann eine komplette Liste an eine Variable übergeben?
sonst muss ich ja im ganzen script excludes ändern zu excludesList
BlackJack

@bluelagoon: Wenn der Name `a` an eine Liste gebunden ist, dann ist nach einer Zuweisung ``b = a`` auch der Name `b` an diese Liste gebunden. Das gilt nicht nur für Listen, sondern für jedes Objekt. Python-Grundwissen…
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

aber ich muss doch irgendwie die Liste ansprechen können?
denn derzeit nimmt er nur den letzten eintrag.
ich hasse Listen ich lese alles immer in array ein auch in php und kann dann auch das ganze ansprechen... aber das hier ... das macht mich echt rasend vor wut.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

bluelagoon hat geschrieben:ich hasse Listen ich lese alles immer in array ein auch in php und kann dann auch das ganze ansprechen... aber das hier ... das macht mich echt rasend vor wut.
Aber.... das ist doch ein Array?
BlackJack

@bluelagoon: Ob Du das in Python an eine Liste oder in PHP an ein Array anhängst macht absolut keinen Unterschied. Dein Verständnisproblem bleibt das gleiche. PHP unterscheidet sich in dem Punkt nicht. PHPs Arrays sind Python's Listen und Wörterbücher in einem Datentyp zusammengefasst und hier wird nur der Listenanteil davon benötigt.

Wenn das in PHP mit Arrays angeblich einfacher geht, kannst Du es ja mal in PHP formulieren und herzeigen. Ich bezweifle das Du in der Lage bist das in PHP, oder irgendeiner anderen Programmiersprache (selber) zu implementieren.
BlackJack

@bluelagoon: Um das mal zu verdeutlichen, das hier wäre Dein Code mit PHP und „Arrays statt Listen”:

Code: Alles auswählen

<?php

function str_startswith($string, $prefix)
{
    return substr($string, 0, strlen($prefix)) == $prefix;
}

$excludesList = array();
foreach (file('test.ini') as $line) {
    if (str_startswith(trim(strtolower($line)), 'excludes')) {
        $tmp = preg_split('/^excludes\s*=\s*/', trim(strtolower($line)));
        $exclude = $tmp[1];
    }
}
$excludesList[] = $exclude;

var_dump($excludesList);

?>
Bei einer Ini-Datei mit drei Exclude-Einträgen:

Code: Alles auswählen

answer=42
excludes=C:\Windows\
excludes=C:\Temp\
excludes=C:\TMP\
parrot=spam
Würdest Du auch in PHP auf diese Weise am Ende nur *einen* Eintrag im Array haben:

Code: Alles auswählen

bj@s8n:~$ php test.php
array(1) {
  [0]=>
  string(7) "c:\tmp\"
}
Antworten