shutil.copy über tausende Dateien. Mit Threads?

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.
ET
User
Beiträge: 6
Registriert: Donnerstag 12. Juni 2008, 10:18
Wohnort: Bochum
Kontaktdaten:

shutil.copy über tausende Dateien. Mit Threads?

Beitragvon ET » Montag 8. Dezember 2008, 08:56

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.
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Beitragvon pysq » Montag 8. Dezember 2008, 09:41

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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Beitragvon Mad-Marty » Montag 8. Dezember 2008, 09:42

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.
ET
User
Beiträge: 6
Registriert: Donnerstag 12. Juni 2008, 10:18
Wohnort: Bochum
Kontaktdaten:

Beitragvon ET » Montag 8. Dezember 2008, 09:55

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
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Beitragvon pysq » Montag 8. Dezember 2008, 10:56

was ist CopyTFW? ich hab nur einen nicht sehr hilfreichen Google Treffer gefunden.
ET
User
Beiträge: 6
Registriert: Donnerstag 12. Juni 2008, 10:18
Wohnort: Bochum
Kontaktdaten:

Beitragvon ET » Montag 8. Dezember 2008, 12:14

: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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]