Seite 1 von 2
python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 07:26
von bluelagoon
Guten morgen,
ich habe grade ein Problem in meinem Script.
hier der Teil des Codes der fehl schlägt
Code: Alles auswählen
while i < len(files):
if not os.path.isfile(files[i]) or not files[i].endswith('tar.gz'):
files.pop(i)
i+=1
files.sort()
tar_file=files[-1]
subprocess.Popen("…\\7zFM.exe", tar_file, tar_file.replace('.tar.gz', '.tar'))
Der Fehler beläuft sich auf die letzte Seite und heisst
File:"C:\Python26\lib\subprocess.py" line 573 in __init__
raise "Type-Error:bufsize must be an integer"
was ist bufsize und warum is die Zeile dann falsch?
Danke schonmal
Ok hab den Fehler gefunden
Ok hab doch noch einen Fehler wie sag ich python wenn letzte sicherung nicht vorhanden dann nimm die erste (Fehler weil nur eine Sicherung existiert)
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 07:40
von frabron
Steht doch da und in der Dokumentation: Das zweite Argument von subprocess.Popen ist die Buffersize, und du übergibts tar_file.
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 08:17
von bluelagoon
ok ich bin nun schon weiter nun sind nur noch der obere Fehler(wenn nur eine tar existiert)
und wenn das Verzeichnis mit 7zip nun geöffnet wird zeigt er die ganzen Tar-files an er soll aber sofort in die letzte Tar-Datei springen
Code: Alles auswählen
fileopen='\\\\David-neu\\Freigaben\\00-C0-9F-46-81-BD\\Sicherung\\'
files=os.listdir("\\\\David-neu\\Freigaben\\00-C0-9F-46-81-BD\\Sicherung\\")
i=0
while i < len(files):
if not os.path.isfile(files[i]) or not files[i].endswith('tar.gz'):
files.pop(i)
i+=1
files.sort()
tar_file=files[-1]
print tar_file
previewfile = subprocess.Popen(["C:\\Programme\\7-Zip\\7zFM.exe",fileopen , tar_file, tar_file.replace('.tar.gz', '.tar')])
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 08:36
von frabron
Bitte was? Ich finde deine Problembeschreibung ziemlich konfus. Wie sieht denn deine Dateistruktur aus? Das kann man aus dem Schnipsel nicht erkennen. Normalerweise ist in einer tar.gz immer nur ein tar drin, wieso willst du denn an das letzte springen? Und was ist das letzte? Nach Änderungsdatum, oder nach Reihenfolge im Archiv oder ein anderes, uns nicht bekanntes Kriterium?
Desweiteren finde ich deine Iteration über eine Liste mittels while doch sehr ungewöhnlich. Normalerweise nimmt man da eine for Schleife, das spart dir auch die index-Variable. Ausserdem ist es wohl keine gute Idee, den Inhalt einer Liste, über die man iteriert zu verändern (pop, sort).
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 08:43
von bluelagoon
damit will ich sagen die Tar-file heisst
datum-uhrzeit.tar.gz
und die zuletzt erstellte tar soll geöffnet werden
das bekomm ich auch bei print raus doch mit 7zip bleibt er im Ordner Sicherungen und zeigt nur die Dateien an ich will aber das er sie öffnet bis zur .tar
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 09:10
von frabron
Sorry, aber wenn Du hier Hilfe möchtest, solltest Du dir wirklich mehr Mühe geben. Deine Tastatur hat eine Shift-Taste, und die deutsche Sprache kennt auch Satzzeichen. Beides möchtest Du bitte in deinem nächsten Post sinnvoll verwenden.
Wie ist denn dein Datum und deine Uhrzeit formatiert? Wenn du
sorted() verwendest, kannst du eine Vergleichsfunktion übergeben, die dir deine Dateiliste entsprechend sortiert. Wenn du dann noch reverse=True übergibst, brauchst du nur noch das erste Element der Liste nehmen, um deine zuletzt erstelle Datei zu erhalten.
Dass dein Ergebnis bei print stimmt ist Zufall. Den Rest deines letzten "Satzes" verstehe ich leider nicht ...
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 09:22
von CM
1. hatten wir das mit dem subprocess-Problem schon in
diesem Thread. Ich finde es nicht witzig, wenn Du nicht liest oder keine Schlüsse aus dem Gelesenem ziehst und einen neuen Thread eröffnest.
2. gibt es in Python das
zipfile-Modul für zipfile-Handling.
3. gibt es in Python das
gzip-Modul für gzippte Files.
4. wäre da noch das
tarfile-Modul
5. 2. bis 4. zusammengenommen: Wozu subprocess? (Schau mal bei Punkt 4 ganz unten in den Beispielen.)
Außerdem kann ich frabron nur recht geben: Du schreibst etwas wirr und nicht in korrekten Sätzen. Fehler passieren, aber etwas Mühe solltest Du Dir schon geben, wenn Du verstanden werden willst.
HTH
Christian
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 09:36
von BlackJack
@bluelagoon: Die Beschreibung ist immer noch unverständlich. Kein Wunder dass Du keine Programme auf die Reihe bekommst, wenn Du das Problem nicht einmal ganz normal in natürlicher Sprache formulieren kannst.
Ergänzend zu frabron's Beitrag: Wenn Du wirklich nur *einen* Dateinamen benötigst, kannst Du auch `min()` oder `max()` mit einer entsprechenden `key`-Funktion verwenden. Von einer Vergleichsfunktion bei `list.sort()` oder `sorted()` würde ich abraten, da auch hier eine `key`-Funktion übergeben werden kann und das `cmp`-Argument ”deprecated” ist.
Falls die Dateinamen so formatiert sind, dass sie bei normalen Zeichenketten-Vergleichen schon die richtige Reihenfolge ergeben, dann kann man sich natürlich `key`/`cmp`-Argumente sparen.
Du möchtest vielleicht auch statt dem wirren Code mit ``while`` und entfernen von Elementen und wiederholtem sortieren *innerhalb* dieser Schleife das getrennt angehen. Also zum Beispiel erst alle Dateinamen filtern, die mit '.tar.gz' enden. Je nachdem wie die Liste zustande kommt, könnte man das auch vorher schon lösen — zum Beispiel `glob.glob()` anstelle von `os.listdir()` verwenden.
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 09:39
von bluelagoon
ja ich hätte es unter dem Subprozess-Thread schreiben sollen
also der Dateiname is yyyymmdd-his.tar.gz
Ich möchte die Dateien eben gleich mit 7zip ansehen deswegen ruf ich es mit Subprozess auf
ja mein deutsch ist eben nicht gut
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 09:59
von /me
bluelagoon hat geschrieben:datum-uhrzeit.tar.gz
und die zuletzt erstellte tar soll geöffnet werden
Dann erstelle dir eine Liste mit allen passenden Dateien und sortiere sie. Dann nimmst du, je nach Sortierrichtung, die erste oder letzte Datei.
bluelagoon hat geschrieben:das bekomm ich auch bei print raus doch mit 7zip bleibt er im Ordner Sicherungen und zeigt nur die Dateien an ich will aber das er sie öffnet bis zur .tar
"human brain: parse error"
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:02
von bluelagoon
naja ich bin ja fast fertig damit.
das Sortieren hab ich bis jetzt ja auch richtig das gibt mir auch die richtige tarfile aus
aber bei subprozess öffnet er nur den Order und zeigt die Sicherungen an
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:05
von frabron
bluelagoon hat geschrieben:
ja mein deutsch ist eben nicht gut
Das ist aber kein Grund, sich keine Mühe zu geben. Wenn ja jetzt fast alles läuft wie du willst, ist ja alles gut. Oder implizierte dein letzer Post eine Frage?
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:05
von BlackJack
@bluelagoon: Was bedeutet 'his' in der Beschreibung des Dateinamens? 'h' = Stunde? Zweistellig?
Sollten die Dateinamen als Zeichenketten sortiert die richtige zeitliche Reihenfolge haben, dann ist das ermitteln der Datei mit der jüngsten Zeitangabe im Dateinamen mittels `fnmatch.filter()` und `max()` jedenfalls ein ganz simpler Einzeiler.
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:09
von bluelagoon
ja das bedeutet Stunde,Minute,Sekunde in zweistellen.
mh ja wie gesagt ich brauch die zuletzt erstellte Tar-file. Und die wird auch richtig aufgewählt. Nur beim subprocess wird sie wieder verloren
hab nur das Problem mit der Tar die ausgewählt werdn sollte
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:44
von BlackJack
@bluelagoon: Hast Du eigentlich mal darüber nachgedacht was Du der ``7zFM.exe`` als Argumente übergibst und warum Du das tust? Wie kommst Du darauf gerade diese drei Argumente zu übergeben? Kann es sein, dass Du hier einfach blind etwas von einem anderen `Popen`-Aufruf kopiert hast!?
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 10:47
von bluelagoon
neeeee
ich sag ja erst ab while das es tarfile-Variable gibt
ich komm auch auf den Ordner drauf aber ich steh immer im Ordner Sicherungen und nicht in der Tar also ich sehe alle angezeigten Dateien nur ich steh net in der Datei selbst
\\Pfad\zu\Sicherung\datei2.gz datei1.gz
will aber in den datei2.gz sofort drin sein ohne anzuklicken verstehst du was ich meine?
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 11:00
von BlackJack
Nein ich verstehe nicht was Du meinst. Das Deine Beiträge unverständlich sind, ist ja aber nichts neues. Deine ”Sätze” sind einfach unverständlich.
Das „neeeee” ist grundsätzlich verständlich, aber ich weiss nicht worauf genau sich das bezieht.
Den zweiten ”Satz” verstehe ich nicht.
„In der Datei stehen” meint wahrscheinlich, dass Du im 7z-Dateimanager nicht den Inhalt des Archivs angezeigt bekommst. Was bei den Argumenten, die Du übergibst, auch nicht weiter verwunderlich ist.
Was soll ``\\Pfad\zu\Sicherung\datei2.gz datei1.gz`` sein? Das ist nicht das was Du als Argumente übergibst. Du übergibst *drei* Argumente, hier sind es nur zwei. Und wenn Du den Inhalt von ``datei2.gz`` angezeigt bekommen möchtest, was soll die Übergabe von ``datei1.gz`` als Argument bewirken? Zumal hier die Dateiendung in dem Beispiel nicht mit dem übereinstimmt, was Du tatsächlich übergibst.
Re: python fehlermeldung typeerror
Verfasst: Montag 4. Juli 2011, 11:17
von frabron
Hier versteht wohl keiner so richtig, was Du meinst! Wieso denn jetzt klicken? Arbeitest du mit einer GUI?
Mal als Denkanstoss
Code: Alles auswählen
# coding: utf-8
import fnmatch
import os
def main():
BACKUP_DIR = os.path.join('/MY', 'BACKUP', 'DIR')
# eigentlich geht das mit Blackjacks Vorschlag, den du ja
# sicherlich gelesen hast, so:
# oldest_file = min(fnmatch.filter(os.listdir(BACKUP_DIR), '*.tar.gz'))
my_backup_files = [
'20110704-115500.tar.gz',
'20110704-115450.tar.gz',
'20110704-115630.tar.gz'
]
oldest_file = min(my_backup_files)
print os.path.join(BACKUP_DIR, oldest_file)
# den subprocess.Popen richtig hinzubekommen, überlasse ich dir ...
if __name__ == '__main__':
main()
Re: python fehlermeldung typeerror
Verfasst: Dienstag 5. Juli 2011, 08:05
von bluelagoon
Code: Alles auswählen
# imports
# -*- coding: utf-8-*-
import cStringIO
import os
import os.path
import platform
import sys
import subprocess
import re
config_file = 'dp_clienttask.ini'
file = open(config_file)
for line in file.readlines():
if line.lower().strip().startswith("boottime"):
choice = re.split('^boottime\s*=\s*([0-9]+)', line.lower().strip())[1]
elif line.lower().strip().startswith("destination="):
dest = re.split('^[dD][eE][sS][tT][iI][nN][aA][tT][iI][oO][nN]\s*=\s*(.+)\s*$', line.lower().strip())[1]
file.close()
class Lock():
if 'linux' in platform.system().lower():
# checks for lock
def check(self):
if os.path.exists(os.path.join(os.path.abspath(__file__), 'dp_backup.lock')):
try:
file = open(os.path.join(os.path.abspath(__file__), 'dp_backup.lock'))
pid = int(file.readline().strip())
file.close()
if os.path.exists('/proc/%s/' % str(pid)):
file = open('/proc/%s/cmdline' % str(pid))
line = file.readline().strip()
file.close()
if line.startswith('python'):
print >> sys.stderr, 'Warning: Process %s already running. Quitting.' % str(pid)
exit(0)
except Exception, e:
print e
elif 'windows' in platform.system().lower():
# checks for lock
def check(self):
if os.path.exists(os.path.join(os.path.abspath(__file__), 'dp_backup.lock')):
try:
file = open(os.path.join(os.path.abspath(__file__), 'dp_backup.lock'))
pid = int(file.readline().strip())
file.close()
try:
os.kill(pid, 0)
# TODO: check whether pid is a running instance of python
print >> sys.stderr, 'Warning: Process %s already running. Quitting.' % str(pid)
exit(0)
except OSError, e:
pass # process is not running
except Exception, e:
print e
class Backup():
def __init__(self, lock, config_file):
self.mac = None
file = None
if 'linux' in platform.system().lower():
try:
for i in os.listdir('/sys/class/net/'):
if self.mac != None:
break
if not i.startswith('eth'):
continue
file = open('/sys/class/net/%s/operstate' % i)
try:
if 'up' in file.read():
file.close()
file = open('/sys/class/net/%s/address' % i)
self.mac = file.readline().strip().replace(':','-')
file.close()
except:
pass
finally:
if file != None and not file.closed:
file.close()
except:
pass
if self.mac == None:
try:
for i in os.listdir('/sys/class/net/'):
if self.mac != None:
break
if not i.startswith('eth'):
continue
try:
file = open('/sys/class/net/%s/address' % i)
self.mac = file.readline().strip().replace(':','-')
file.close()
except:
pass
finally:
if file != None and not file.closed:
file.close()
except:
pass
elif 'windows' in platform.system().lower():
for line in os.popen(r"C:\WINDOWS\system32\ipconfig.exe /all"):
match = re.search('((?:[0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2})', line)
if match != None:
self.mac = match.group()
break
if self.mac == None:
print >> sys.stderr, '''ERROR: Coulnd't retrieve MAC-address!'''
exit(1)
self.current_archive = None
file=open("file.txt","w")
file.write(dest)
file.write('\\')
file.write(self.mac)
file.close()
i=0
#while i < len(files):
# if not os.path.isfile(file[i]) or not files[i].endswith('tar.gz'):
# files.pop(i)
# i+=1
# files.sort()
# tar_file=files[-1]
# print tar_file
# previewfile = subprocess.Popen(["C:\\Programme\\7-Zip\\7zFM.exe",dest , tar_file])#, tar_file.replace('.tar.gz', '.tar')])
Need my Macadress and the path to the file-folder do you understand me?...
ich brauch dazu die mac-adresse und den Pfad zum Ordner dann die Sicherungstar und dann die gepackten Dateien.
soll ichs euch aufmalen?
~> path\mac\ordner\sicherung.tar.gz\\path\mac\ordner\sicheung.tar
das is alles was ich will.
please close my thread
es is einfach sinnlos hier zu erklären was ich erreichen möchte.
Re: python fehlermeldung typeerror
Verfasst: Dienstag 5. Juli 2011, 09:15
von EyDu
bluelagoon hat geschrieben:es is einfach sinnlos hier zu erklären was ich erreichen möchte.
Du hast es doch noch nicht einmal versucht

Du schreibst viele zusammenhangslose Texte in denen auf einmal aus dem Kontext gerissene oder vollkommen unbekannte Dinge auftauchen. Wie zum Beispiel deine GUI. Versuche dein Problem doch mal in klare, logische strukturierte Sätze zu packen, welche dein Problem beschreiben, was du für ein Ergebnis erwartetst und welchen Fehler du bekommst. Und dazu noch ein Minimalbeispiel, in welches man sich nicht erst 15 Minuten einliest, dein Problem allerdings reproduziert. Ich würde zum Beispiel bei deinem Code erstmal anfangen die ganzen leeren, fehlerverschlingenden excepts zu entfernen.