2012-01-03 12 views
6

मैं आईई के डीओएम को एक अलग धागे से देखने की कोशिश कर रहा हूं जो आईई भेजता है, और कुछ गुणों के लिए मुझे "ऐसा इंटरफ़ेस समर्थित नहीं है" त्रुटि मिल रही है।पायथन, कॉम और मल्टीथ्रेडिंग समस्या

import threading, time 

import pythoncom 
from win32com.client import Dispatch, gencache 
gencache.EnsureModule('{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}', 0, 4, 0) # MSHTML 

def main(): 
    pythoncom.CoInitializeEx(0) 
    ie = Dispatch('InternetExplorer.Application') 
    ie.Visible = True 
    ie.Navigate('http://www.Rhodia-ecommerce.com/') 
    while ie.Busy: 
     time.sleep(1) 

    def printframes(): 
     pythoncom.CoInitializeEx(0) 
     document = ie.Document 
     frames = document.getElementsByTagName(u'frame') 
     for frame in frames: 
      obj = frame.contentWindow 

    thr = threading.Thread(target=printframes) 
    thr.start() 
    thr.join() 

if __name__ == '__main__': 
    thr = threading.Thread(target=main) 
    thr.start() 
    thr.join() 

सब कुछ frame.contentWindow जब तक ठीक है: मैं इस स्क्रिप्ट के लिए समस्या को कम करने में कामयाब रहे। फिर बम:

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\python22\lib\threading.py", line 414, in __bootstrap 
    self.run() 
    File "C:\python22\lib\threading.py", line 402, in run 
    apply(self.__target, self.__args, self.__kwargs) 
    File "testie.py", line 42, in printframes 
    obj = frame.contentWindow 
    File "C:\python22\lib\site-packages\win32com\client\__init__.py", line 455, in __getattr__ 
    return self._ApplyTypes_(*args) 
    File "C:\python22\lib\site-packages\win32com\client\__init__.py", line 446, in _ApplyTypes_ 
    return self._get_good_object_(
com_error: (-2147467262, 'No such interface supported', None, None) 

कोई संकेत?

+1

आपके प्रश्न के लिए ऑर्थोगोनल: पायथन 2.7 पर अपडेट करें; कोशिश करें [सेलेनियम] (http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html) – jfs

+0

अभी कोई विकल्प नहीं है; मैं एक व्यावसायिक संदर्भ में हूं और सेलेनियम क्या करता है उससे हम बहुत कुछ करते हैं। हम यद्यपि पाइथन को अपग्रेड करने के रास्ते पर हैं :) हमने मुफ्त थ्रेडिंग के बजाय अपार्टमेंट का उपयोग करके और हाथ से मार्शलिंग सामान के बजाय एक कामकाज पाया लेकिन मैं अभी भी उत्सुक हूं। – fraca7

उत्तर

1

सही जवाब हाथ से मार्शल सामान के लिए है। यह एक कामकाज नहीं है जो आपको यहां करना है। हालांकि आपको अपार्टमेंट थ्रेडिंग का उपयोग नहीं करना चाहिए।

आप बहु फ्लैट के रूप में initialised - कि COM कि यहअपने इंटरफेस किसी भी धागे पर कॉल कर सकते हैं बताता है। यह नहीं आपको किसी भी थ्रेड पर अन्य इंटरफेस कॉल करने की अनुमति देता है, या COM द्वारा प्रदान किए गए मार्शलिंग इंटरफेस से आपको क्षमा करता है। यह केवल "दुर्घटना से" काम करेगा - उदा। यदि आप जिस ऑब्जेक्ट को कॉल कर रहे हैं वह एक प्रक्रिया में एमटीए ऑब्जेक्ट होता है, इससे कोई फर्क नहीं पड़ता।

CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream व्यवसाय करता है।

इसका कारण यह है कि ऑब्जेक्ट्स अपने स्वयं के प्रॉक्सी प्रदान कर सकते हैं, जो मुक्त-थ्रेडेड हो सकते हैं या नहीं भी हो सकते हैं। (या वास्तव में कस्टम marshalling प्रदान करते हैं)। आपको उन्हें बताने के लिए उन्हें मार्शल करना होगा कि वे धागे के बीच आगे बढ़ रहे हैं। यदि प्रॉक्सी मुक्त थ्रेड किया गया है, तो आप एक ही सूचक वापस प्राप्त कर सकते हैं।

संबंधित मुद्दे