Seite 1 von 1

shutil.copy über tausende Dateien. Mit Threads?

Verfasst: Montag 8. Dezember 2008, 08:56
von ET
Hallo Community,

ich habe wieder mal eine Laienfrage. Ich habe ein Progrämmchen geschrieben, welches sehr viele Dateien nach einem bestimmten Kriterium von einem Verz. in ein anderes kopiert. Dazu habe ich mit PyQt eine kleine grafische Oberfläche gemacht mit der man bequem die Quelle und das Ziel-Verz. aussuchen kann. Und den Status des Kopiervorgangs wollte ich in einem Textfenster "ausgabe" ausgeben lassen.

Code: Alles auswählen

def onStart(self):
        von_verz = unicode(self.directorySource)
        nach_verz = unicode(self.directoryTarget)

        files = os.listdir(nach_verz)
        for f in files:
            datei = f.lower().replace(".tif", "")

            try:
                shutil.copy(von_verz+"/"+datei+".tfw", nach_verz)
                self.ausgabe.setText("
"+"copy "+datei+".tfw"+self.ausgabe.toPlainText())
            except:
                self.ausgabe.setText("
"+"Fehler beim Kopieren! "+von_verz+"/"+datei+".tfw nach "+nach_verz+"/"+self.ausgabe.toPlainText())
        else:
            self.ausgabe.setText("<<< FERTIG! >>>"+self.ausgabe.toPlainText())
Nun ist es aber so, dass wenn ich die Methode starte werden die Dateien zwar wie gewünscht kopiert, jedoch bekomme ich keine laufende Ausgabe im meinem self.ausgabe.setText(), sondern nur am Ende des Kopiervorgangs werden mir auf einen Schlag alle Zeilen angezeigt. Außerdem ist das GUI-Fenster während des Kopierens nicht ansprechbar und gibt dem System keine Rückmeldung.

Wie bekomme ich das so hin, dass mein GUI-Fenster während des kopierens ordentlich, wie es z.b: in einer Konsole der Fall ist die kopierten Datensätze anzeigt und dabei nicht hängen bleibt? Also ich vermute die Lösung liegt in den Threads, aber dafür fehlt mir in Python (oder auch allgemein) die Übersicht.

Danke.

Verfasst: Montag 8. Dezember 2008, 09:41
von pysq
hallo ET,

das Modul threading könnte eine Lösung für dein Problem sein. du willst die Funktion onstart allerdings sicherlich mehrfach ausführen können. kannst du mal bitte den gesamten Code posten?

mfg pysq

Verfasst: Montag 8. Dezember 2008, 09:42
von Mad-Marty
welcher Gui kit?

sofern der Kit nichts fertiges für filecopy hat musst du eben selbst was asynchrones / threadbasiertes bauen.

Versuche GUI methoden als Trigger zu sehen und nicht als durchführende Methode für länger dauernde operationen.

Verfasst: Montag 8. Dezember 2008, 09:55
von ET
Also ich benutze PyQt4 für die GUI Oberfläche, dachte aber dass das Kopieren eher eine sache von shutil ist. Gibt es den auch so etwas schon fertiges und mit den Threads versehenes in dem PyQt4?

Hier mein Code...

Code: Alles auswählen

import sys, os, shutil
from PyQt4 import QtGui, QtCore
from CopyTFW import Ui_CopyTFW as Dlg

class MeinDialog(QtGui.QDialog, Dlg):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setupUi(self)

        #Slot einrichten
        self.connect(self.buttonStart, QtCore.SIGNAL("clicked()"), self.onStart)
        self.connect(self.buttonSource, QtCore.SIGNAL("clicked()"), self.onSource)
        self.connect(self.buttonTarget, QtCore.SIGNAL("clicked()"), self.onTarget)

    def onSource(self):
        self.directorySource = QtGui.QFileDialog.getExistingDirectory(self,
                    self.tr("Verzeichnis mit allen TFWs (Quelle)"),
                    "C:/",
                    QtGui.QFileDialog.DontResolveSymlinks | QtGui.QFileDialog.ShowDirsOnly)
        
        if not self.directorySource.isEmpty():      
            self.pathSource.setText(self.directorySource)
            #print os.path.normcase(str(unicode(self.directorySource)))
            
    def onTarget(self):
        self.directoryTarget = QtGui.QFileDialog.getExistingDirectory(self,
                    self.tr("Verzeichnis mit Rasterdaten (Ziel)"),
                    "C:/",
                    QtGui.QFileDialog.DontResolveSymlinks | QtGui.QFileDialog.ShowDirsOnly)
        
        if not self.directoryTarget.isEmpty():
            self.pathTarget.setText(self.directoryTarget)


    def onStart(self):
        von_verz = unicode(self.directorySource)
        nach_verz = unicode(self.directoryTarget)

        files = os.listdir(nach_verz)
        for f in files:
            datei = f.lower().replace(".tif", "")

            try:
                shutil.copy(von_verz+"/"+datei+".tfw", nach_verz)
                self.ausgabe.setText("n"+"copy "+datei+".tfw"+self.ausgabe.toPlainText())
            except:
                self.ausgabe.setText("n"+"Fehler beim Kopieren! "+von_verz+"/"+datei+".tfw nach "+nach_verz+"/"+self.ausgabe.toPlainText())
        else:
            self.ausgabe.setText("<<< FERTIG! >>>"+self.ausgabe.toPlainText())
        
        

app=QtGui.QApplication(sys.argv)
dialog=MeinDialog()
dialog.show()
sys.exit(app.exec_())
Hier mein Screenschot der GUI Oberfläche mit der Ausgabe der Statusmessages nach dem Kopiervorgang:

Bild

Verfasst: Montag 8. Dezember 2008, 10:56
von pysq
was ist CopyTFW? ich hab nur einen nicht sehr hilfreichen Google Treffer gefunden.

Verfasst: Montag 8. Dezember 2008, 12:14
von ET
:lol: CopyTFW ist die Klasse mit der GUI. Ich habe diese automatisch mit dem Qt-Designer generiert und selber den Namen vergeben. Da ligen also nur die grafischen Komponenten des fensters und deren Plazierung.