Форум сайта python.su
Пытаюсь писать в текущий активный лист Excel в заданную ячейку строку посредством Thread-а. Вылетает сообщение об ошибке, которое без поллитра не поймешь..
Кто-нибудь знает, что за ошибка и как устранить?
скрипт:
import sys, time
import threading
import pythoncom
from win32com.client import Dispatch
class coterwriter(threading.Thread):
def __init__(self,i):
threading.Thread.__init__(self)
self.xlApp = Dispatch('Excel.Application')
self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = “blablabla”
def put_mark(self,mark):
self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = mark
def run(self):
self.put_mark(“blablabla”)
a = coterwriter(1)
a.start()
Офлайн
Ну а что за ошибка то?
http://msdn.microsoft.com/en-us/library/aa909149.aspx
Попробуй это. Виндой давно не пользовался в таком ключе, да и вообще. Помню что раньше было необходимо вызывать указанную функцию в потоке, что бы в нем заработало COM объекты.
p.s. Естественно ищи порт в pywin32. У меня его нет и нет документации по нему.
p.p.s. Вроде это подойдет http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/pywin32/pythoncom__CoInitializeEx_meth.html.
..bw
Отредактировано (Июнь 30, 2008 13:19:51)
Офлайн
bwошибка:
Ну а что за ошибка то?
http://msdn.microsoft.com/en-us/library/aa909149.aspx
Попробуй это. Виндой давно не пользовался в таком ключе, да и вообще. Помню что раньше было необходимо вызывать указанную функцию в потоке, что бы в нем заработало COM объекты.
p.s. Естественно ищи порт в pywin32. У меня его нет и нет документации по нему.
..bw
Офлайн
> com_error: (-2147221008, ‘Не был произведен вызов CoInitialize.’, None, None)
bw> Помню что раньше было необходимо вызывать указанную функцию в потоке, что бы в нем заработало COM объекты.
bw> p.p.s. Вроде это подойдет http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/pywin32/pythoncom__CoInitializeEx_meth.html.
..bw
Отредактировано (Июнь 30, 2008 13:22:39)
Офлайн
bwссылка не работает:(
> com_error: (-2147221008, ‘Не был произведен вызов CoInitialize.’, None, None)
bw> Помню что раньше было необходимо вызывать указанную функцию в потоке, что бы в нем заработало COM объекты.
bw> p.p.s. Вроде это подойдет http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/pywin32/pythoncom__CoInitializeEx_meth.html.
..bw
Офлайн
Убери точку в конце ссылки :-).
..bw
Офлайн
import sys, time
import threading
from win32com.client import Dispatch
import pythoncom
class coterwriter(threading.Thread):
def __init__(self,i):
pythoncom.CoInitialize()
threading.Thread.__init__(self)
self.xlApp = Dispatch('Excel.Application')
self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = “blablabla”
def put_mark(self,mark):
self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = mark
def run(self):
try:
self.put_mark(“blablabla”)
finally:
pythoncom.CoUninitialize()
a = coterwriter(1)
a.start()
выдает ровно ту-же ошибку
или я туплю со страшной силой
Офлайн
Второе ;-).
def run(self): pythoncom.CoInitialize() try: self.xlApp = Dispatch('Excel.Application') self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = "blablabla" self.put_mark("blablabla") finally: pythoncom.CoUninitialize()
Отредактировано (Июнь 30, 2008 13:59:28)
Офлайн
it works!
Спасибо большое!
А неужели нельзя указать на COM-объект в одном месте (метод init) а использовать в другом (run)?
Если можно, как тогда играться с этими CoInitialize-ами?
Офлайн
А разве CoInitialize не нужно для каждого потока в отдельности делать?
Офлайн