python fehlermeldung typeerror

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,
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)
Zuletzt geändert von bluelagoon am Montag 4. Juli 2011, 07:47, insgesamt 1-mal geändert.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Steht doch da und in der Dokumentation: Das zweite Argument von subprocess.Popen ist die Buffersize, und du übergibts tar_file.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

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')]) 
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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

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
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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 ...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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

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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

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
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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

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

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?
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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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

:evil:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Antworten