Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2008 12:45:46

AntonSlepnev
От:
Зарегистрирован: 2008-06-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

Пытаюсь писать в текущий активный лист 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()



Офлайн

#2 Июнь 30, 2008 13:15:30

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Python+EXCEL

Ну а что за ошибка то?

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)

Офлайн

#3 Июнь 30, 2008 13:18:47

AntonSlepnev
От:
Зарегистрирован: 2008-06-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

bw
Ну а что за ошибка то?

http://msdn.microsoft.com/en-us/library/aa909149.aspx

Попробуй это. Виндой давно не пользовался в таком ключе, да и вообще. Помню что раньше было необходимо вызывать указанную функцию в потоке, что бы в нем заработало COM объекты.

p.s. Естественно ищи порт в pywin32. У меня его нет и нет документации по нему.

..bw
ошибка:
Exception in thread Thread-1:
Traceback (most recent call last):
File “C:\Python25\lib\threading.py”, line 460, in __bootstrap
self.run()
File “C:\Documents and Settings\a.slepnev-sokolinsky\Desktop\coter_writer.py”, line 14, in run
self.put_mark(“blablabla”)
File “C:\Documents and Settings\a.slepnev-sokolinsky\Desktop\coter_writer.py”, line 12, in put_mark
self.xlApp.ActiveWorkbook.ActiveSheet.Cells(1,1).Value = mark
File “C:\Python25\lib\site-packages\win32com\client\dynamic.py”, line 491, in __getattr__
raise pythoncom.com_error, details
com_error: (-2147221008, ‘\xcd\xe5 \xe1\xfb\xeb \xef\xf0\xee\xe8\xe7\xe2\xe5\xe4\xe5\xed \xe2\xfb\xe7\xee\xe2 CoInitialize.’, None, None)



Офлайн

#4 Июнь 30, 2008 13:21:51

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Python+EXCEL

> 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)

Офлайн

#5 Июнь 30, 2008 13:28:24

AntonSlepnev
От:
Зарегистрирован: 2008-06-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

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
ссылка не работает:(



Офлайн

#6 Июнь 30, 2008 13:32:39

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Python+EXCEL

Убери точку в конце ссылки :-).

..bw



Офлайн

#7 Июнь 30, 2008 13:46:07

AntonSlepnev
От:
Зарегистрирован: 2008-06-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

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()


выдает ровно ту-же ошибку
или я туплю со страшной силой



Офлайн

#8 Июнь 30, 2008 13:57:38

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Python+EXCEL

Второе ;-).

    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()

В потоке выполняется метод run, инициализация объекта происходит в том потоке, в котором ты его создаешь. И я в поток вынес всю работу с COM.

..bw



Отредактировано (Июнь 30, 2008 13:59:28)

Офлайн

#9 Июнь 30, 2008 14:07:32

AntonSlepnev
От:
Зарегистрирован: 2008-06-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

it works!

Спасибо большое!

А неужели нельзя указать на COM-объект в одном месте (метод init) а использовать в другом (run)?
Если можно, как тогда играться с этими CoInitialize-ами?



Офлайн

#10 Июнь 30, 2008 22:39:55

spSerg
От:
Зарегистрирован: 2008-01-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python+EXCEL

А разве CoInitialize не нужно для каждого потока в отдельности делать?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version