Найти - Пользователи
Полная версия: threading + win32com.client
Начало » Python для экспертов » threading + win32com.client
1
Ace
Добрый !

Прошу помощи.
Инструменты - 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 - такая же ошибка
odnochlen
Кнопочку code на панели бебекодов видишь?
Ace
odnochlen
Кнопочку code на панели бебекодов видишь?
Сори, не воспользовался. Так правильно ?
odnochlen
Отступы неправильные и последний блок тоже в code засунь.
Отступы в питоне по 4 пробела.
Ace
odnochlen
Отступы неправильные и последний блок тоже в code засунь.
1. Отступы в сорсе - по одному пробелу. Вставлял в форум прямо из рабочего сорса.
2. Если последний блок - это есть output, то пжалста
odnochlen
Ace
1. Отступы с сорсе - по одному пробелу. Вставлял в форум прямо из рабочего сорса.
И он компилируется? о_О
Лол, бред какой-то.

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

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

Может я выбрал технологически неграмотный путь и потоки не подойдут для решения ?
adw0rd
Попробуйте вместо threading использовать multiprocessing:
import multiprocessing
p = multiprocessing.Process(target=fuu, args=(5, ))
p.start()

ps. Надо в форум добавить autopep8
PooH
Я, конечно виндовс давно видел в последний раз, но смутно помню, что в каждом потоке надо COM отдельно инициализировать CoInitialize
Ace
Рабочий код;

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

Благодарю всех ! Тему можно закрыть
Плюсики розданы
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB