Thread erzeugt Fehlermeldung

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.
Antworten
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Und wieder was zum Rätseln:
Folgendes Script (Auszug) erstellt um 23:58 ein Excel-Protokoll.
Starte ich das Script um 23:59 wird das Protokoll wie zu erwarten sofort erstellt.
Starte ich es vor 23:58 und drücke den "Protokoll" Button, wird das Protokoll
ebenfalls korrekt erstellt. Starte ich aber das Script vor 23:58 und warte bis 23:58,
dann kommt folgende Fehlermeldung:

Code: Alles auswählen

File "test2.py", line 34, in Protokoll
    Report = win32com.client.Dispatch("Excel.Application")
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\dynamic.py", line 79, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
Ersetze ich im Script den Thread durch eine While-Schleife, gibt es keine Fehlermeldung, habe dann aber keinen
10 Sekunden Takt (der für den Rest der Anwendung nötig ist). Was macht der Thread, daß es zu der
Fehlermeldung kommt ?

Soviel für die Nacht , Seven

Hier das Script:

Code: Alles auswählen

import time,sys,string,win32com.client,win32api,threading,os
from Tkinter import Tk,Button
from tkSnack import initializeSnack

root =  Tk()
initializeSnack(root)

class globelvars:
    fname1 = ''
    fname2 = ''
    loct = 0
    
gv = globelvars()

def Beenden(event=None):
    T.cancel()
    sys.exit(0)
    
def Handle(): 
    global T
    
    T = threading.Timer(10, Handle)     #Alle 10 Sekunden pruefen
    T.start()
    
    gv.loct = time.localtime()
    gv.fname2 = 'Protokoll' + "_%02d%02d" % (gv.loct[2],gv.loct[1]) + str(gv.loct[0])[2:]
        
    if gv.loct[3] == 23 and gv.loct[4] >= 58:              #Um 23:58 Protokoll erstellen
        if not os.path.isfile("G:/tempfiles/" + gv.fname2 + ".xls"):
            Protokoll()
            
def Protokoll():
    Report = win32com.client.Dispatch("Excel.Application")
    Report.Visible = 0

    workbook = Report.Workbooks.Add()
    worksheet = workbook.Worksheets('Tabelle1')
    worksheet.Name = 'Ausgang'
    header = ["ID","Text","Archiv","Musik ?","E-Mail / Kunde","Tel. Nr.","Eingang","Ausgang"]
    width = ['6','15','25','10','20','17','17','17']
            
    for j in range(1,9):                #Kopfzeile eintragen
        cell = worksheet.Cells(1,j)
        cell.ColumnWidth = width[j-1]
        cell.Font.Bold = 1
        cell.Font.Size = 12
        cell.Value = header[j-1]
    """
    z = 1
    for i in range(1,5):
        gv.fname1 = "Bestell" + str(i) + "_%02d%02d" % (gv.loct[2],gv.loct[1]) + str(gv.loct[0])[2:]
        d = open("G:/tempfiles/" + gv.fname1 + ".txt","r")
        d.seek(0)                   #bei Byte #4 steht steht 'previous'
        lst = int(d.read(4))
        d.seek(32)                  #Daten beginnen ab Byte 32
        na = d.readlines()
        d.close()
   
        for j in range(0,lst-1,11):
            worksheet.Cells(z+1,1).Value = "_" + na[j][:-1]       #ID, [:-1] = ohne \n
            worksheet.Cells(z+1,2).Value = na[j+1][:-1]           #Text
            worksheet.Cells(z+1,3).Value = na[j+2][1:-1]+"   "+na[j+3][1:-1]+"   "+na[j+4][1:-1] #Archiv
            temp = na[j+5][:-1]
            trenner = string.find(temp,'/')
            if temp[0:trenner] =='mit Musik':
                worksheet.Cells(z+1,4).Value = 'mit Musik'        #Musik
            else:
                worksheet.Cells(z+1,4).Value = ''
            worksheet.Cells(z+1,5).Value = na[j+6][:-1]           #EMail
            worksheet.Cells(z+1,6).Value = na[j+7][:-1]           #Telnr
            worksheet.Cells(z+1,7).Value = na[j+8][:-1]           #Eingang
            worksheet.Cells(z+1,8).Value = na[j+9][:-1]           #Ausgang
            z += 1
        z += 1              #Leerzeile
    """
    workbook.SaveAs("G:/tempfiles/" + gv.fname2 + ".xls")
    Report.Quit()
    del(cell) 
    del(worksheet) 
    del(workbook) 
    del(Report) 
    
protok = Button(root,font='ansifixed', text = "Protokoll ", command = Protokoll)
protok.pack()
bstop = Button(root,font='ansifixed', text = "Beenden", command = Beenden)
bstop.pack()

Handle()
root.mainloop()
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Habs:
Wenn ich den Import von win32com direkt in der Funktion ausführe und nicht global, kommt keine Fehlermeldung. Fragt mich aber nicht warum.

So gehts:

Code: Alles auswählen

def Protokoll():
    import win32com.client
So nicht (???):

Code: Alles auswählen

import win32com.client
def Protokoll():
Seven
Antworten