die letzten Tage hab ich mich mit dem multiprocessing-Modul auseinander gesetzt. Leider treten bei mir immer wieder Probleme auf. Um das ganze etwas zu üben, hab ich mir ein kleines Projekt überlegt. Mit einer PyQt-Oberfläche wähle ich einen Ordner aus in dem Textdateien liegen. Ich lade all Textdateien und übergebe sie an den Pool. Anschließend speichere ich den Text aller Dateien in einer Datei. Leider bekomme ich beim Drücken auf den "Combine Files"-Button die Fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Python34\lib\multiprocessing\process.py", line 254, in _bootstrap
self.run()
File "C:\Python34\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "C:\Python34\lib\multiprocessing\pool.py", line 107, in worker
task = get()
File "C:\Python34\lib\multiprocessing\queues.py", line 357, in get
return ForkingPickler.loads(res)
RuntimeError: super-class __init__() of type Form was never called
Code: Alles auswählen
from multiprocessing import Pool
import sys,glob
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QWidget, QPushButton, QListWidget, QFileDialog, QLineEdit
class Form(QWidget):
def __init__(self):
super(Form,self).__init__()
self.resize(400,100)
self.setWindowTitle("Combine Directory Files")
self.btnDirectory = QPushButton("Select Directory...",self)
self.btnDirectory.move(10,25)
self.btnDirectory.clicked.connect(self.openDirectoryDialog)
self.btnCombine = QPushButton("Combine Files", self)
self.btnCombine.move(315,25)
self.btnCombine.clicked.connect(self.combineFiles)
self.txtDirectory = QLineEdit(self)
self.txtDirectory.move(115,25)
self.txtDirectory.resize(200,23)
self.txtDirectory.setDisabled(True)
def openDirectoryDialog(self):
self.directory = QFileDialog.getExistingDirectory(self,"Select Directory", "C:\\Users\\std\\Desktop")
self.txtDirectory.setText(self.directory) #write selected directory to textfield
def getFilenames(self,directory):
return glob.glob(directory + "\\*") #get all Files from directory as array
def getFileContent(self, filepath):
return open(filepath,"r") #return file content
def saveFile(self, content, filepath):
a = open(filepath + "\\combinedFiles.txt","w")
a.write(content)
a.close()
def combineFiles(self):
if(len(self.directory) > 0): #if user selected a directory
content = ""
filenames = self.getFilenames(self.directory)
pool = Pool()
filecontent = pool.map(self.getFileContent,filenames)
pool.close()
pool.join()
content+=filecontent
self.saveFile(content,"C:\\Users\\std\\Desktop")
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
form = Form()
form.show()
sys.exit(app.exec_())
Code: Alles auswählen
super(Form,self).__init__()