Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 5, 2012 18:02:02

Ace
Зарегистрирован: 2012-09-05
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

threading + win32com.client

Добрый !

Прошу помощи.
Инструменты - Vista SP2 x86, python 3-2-3, pywin32-217, python WMI 1.4.9 . Всё самое свежее
Пытаюсь запустить функцию в потоках.
Простой код (без потока) работает:

import win32com.client
def fuu(id): 
    print ('f1')
    objWMI4=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
    print ('f2')
# Main function
objWMIServiceLocal=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
print ('1')
fuu(5) 
print ('2')

Всё компилится и выполняется
Попытка ввести именно эту функцию в поток вызывает ошибку COM (насколько я понимаю)

import win32com.client
import threading
def fuu(id): 
    print ('f1')
    objWMI4=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
    print ('f2')
# Main function
objWMIServiceLocal=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
print ('1')
t = threading.Thread(target=fuu,args= (5,) ) 
print ('2')
t.start()
print ('3')
Отключение создания объекта objWMI4 позволяет нормально запускать функцию.
Включение - вызывает ошибку:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\Python 3-2-3\lib\threading.py", line 740, in _bootstrap_inner
    self.run()
  File "D:\Python 3-2-3\lib\threading.py", line 693, in run
    self._target(*self._args, **self._kwargs)
  File "d:\fb-py4-1.py", line 9, in fuu
    objWMI4=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
  File "D:\Python 3-2-3\lib\site-packages\win32com\client\__init__.py", line 72,
 in GetObject
    return Moniker(Pathname, clsctx)
  File "D:\Python 3-2-3\lib\site-packages\win32com\client\__init__.py", line 87,
 in Moniker
    moniker, i, bindCtx = pythoncom.MkParseDisplayName(Pathname)
pywintypes.com_error: (-2147221020, 'Синтаксическая ошибка', None, None)

P.S. Только что попробовал на Python 2.7 - такая же ошибка

Отредактировано Ace (Сен. 5, 2012 23:03:22)

Офлайн

#2 Сен. 5, 2012 21:39:50

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading + win32com.client

Кнопочку code на панели бебекодов видишь?

Офлайн

#3 Сен. 5, 2012 22:16:14

Ace
Зарегистрирован: 2012-09-05
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

threading + win32com.client

odnochlen
Кнопочку code на панели бебекодов видишь?
Сори, не воспользовался. Так правильно ?

Офлайн

#4 Сен. 5, 2012 22:41:12

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading + win32com.client

Отступы неправильные и последний блок тоже в code засунь.
Отступы в питоне по 4 пробела.

Отредактировано odnochlen (Сен. 5, 2012 22:49:26)

Офлайн

#5 Сен. 5, 2012 22:50:27

Ace
Зарегистрирован: 2012-09-05
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

threading + win32com.client

odnochlen
Отступы неправильные и последний блок тоже в code засунь.
1. Отступы в сорсе - по одному пробелу. Вставлял в форум прямо из рабочего сорса.
2. Если последний блок - это есть output, то пжалста

Отредактировано Ace (Сен. 5, 2012 23:00:24)

Офлайн

#6 Сен. 5, 2012 22:52:15

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading + win32com.client

Ace
1. Отступы с сорсе - по одному пробелу. Вставлял в форум прямо из рабочего сорса.
И он компилируется? о_О
Лол, бред какой-то.

Ладно, но рекомендуются все равно 4 пробела.
На этом выполнять работу мочераторов по бурчанию прекращаю.

Отредактировано odnochlen (Сен. 5, 2012 22:55:35)

Офлайн

#7 Сен. 5, 2012 22:54:29

Ace
Зарегистрирован: 2012-09-05
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

threading + win32com.client

odnochlen
Ace
1. Отступы с сорсе - по одному пробелу. Вставлял в форум прямо из рабочего сорса.
И он компилируется? о_О
Имянно. Выполняется нормально в 3.2.3 и 2.7. Кроме той части, которая вызвала вопрос
Могу отформатить табами. Может редактор чёнить по-своему делает. Не в это суть. Помочь заменить пробелы на табы ?

Если с офрмлением порядок, то готов выслушать ответы по самому вопросу.
Возможно, общее описание задачи облегчит понимание:
- нужно опросить 140 вин-серверов
- данные получаются через WMI , поэтому создание COM-объекта необходимо
- опрос должен идти максимально быстро
- сама функа опроса данных есть и отлажена, занимает 8-15 сек на простаивающем сервере
(4 сервера в секунду при последовательной работе - это очень медленно)

Может я выбрал технологически неграмотный путь и потоки не подойдут для решения ?

Отредактировано Ace (Сен. 5, 2012 23:13:45)

Офлайн

#8 Сен. 6, 2012 00:50:12

adw0rd
От: Санкт-Петербург
Зарегистрирован: 2012-07-28
Сообщения: 107
Репутация: +  8  -
Профиль   Отправить e-mail  

threading + win32com.client

Попробуйте вместо threading использовать multiprocessing:

import multiprocessing
p = multiprocessing.Process(target=fuu, args=(5, ))
p.start()

ps. Надо в форум добавить autopep8




Python, Django, Flask, Git, Emacs, Nginx, MySQL, SphinxSearch, Redis, Linux, FreeBSD
Мой блог, я на GitHub

Отредактировано adw0rd (Сен. 6, 2012 00:57:27)

Офлайн

#9 Сен. 6, 2012 05:30:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

threading + win32com.client

Я, конечно виндовс давно видел в последний раз, но смутно помню, что в каждом потоке надо COM отдельно инициализировать CoInitialize



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#10 Сен. 6, 2012 08:05:41

Ace
Зарегистрирован: 2012-09-05
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

threading + win32com.client

Рабочий код;

import win32com.client
import threading
import pythoncom
def fuu(id):
 pythoncom.CoInitialize()
 try:
  print ('f1')
  objWMI4=win32com.client.GetObject(r"winmgmts:\\.\root\cimv2")
  print ('f2')
 finally:
  pythoncom.CoUninitialize()
# Main function
print ('1')
t = threading.Thread(target=fuu,args=(5,)) 
print ('2')
t.start()
print ('3')

Благодарю всех ! Тему можно закрыть
Плюсики розданы

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version