[python-win32] Python service hangs in Dispatch when frozen with py2exe

Mark Hammond skippy.hammond at gmail.com
Tue May 25 02:03:06 CEST 2010


It might be worth making a call to 
pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED) in the thread 
which is doing this work.

I *suspect* the problem will be related to when the import of pythoncom 
happens in the 2 environments - when it is first imported, it will call 
CoInitialize for you on that thread under the assumption it is the 
"main" thread.  On a py2exe environment, it may be that for obscure 
reasons, that first import of pythoncom happens on a different thread. 
Googling for 'coinit_flags' should turn up more background about how 
CoInit is done and can be controlled in pythoncom.

HTH,

Mark

On 25/05/2010 8:36 AM, Don Dwiggins wrote:
> OK, I have more information that may help.  Looking into the code
> invoked by IA.clsAuthorizeBatch(), I've found that the hangup occurs in
> the call to pythoncom.new in CoClassBaseClass in
> win32com\client\__init__.py.
>
> Interestingly, if I run the code in the "main" Twisted thread, it
> executes without a problem (this is running the source, with py2exe out
> of the picture). If I run it in a subthread (using Twisted's
> DeferToThread) it hangs in the following call:
>
>> oo = pythoncom.new(IA.clsAuthorizeBatch.CLSID)
>
> .. where IA is the gen_py file, as before. The COM DLL is implemented in
> VB with a single threaded model (although I've tried making it apartment
> threaded as well).
>
> I can't go any deeper at the python level, since pythoncom is a DLL.
>
> As before, any advice appreciated ...
>
> I wrote previously:
>> I'm developing a Python service under Win XP with Python 2.5 (the
>> service is built on Twisted's XMLRPC server). For delivery to
>> production, I "compile" it with py2exe. It's been running fine, but
>> I've hit a snag.
>>
>> I've written new code to access a COM object (in a DLL); the code I've
>> written does works successfully as long as I'm running the source
>> under PythonService.
>>
>> The compiled version, however, hangs up in the call to Dispatch to get
>> the COM object. I've put in debugging log entries all through the
>> relevant section of code, and it's clear that it simply never returns
>> from the Dispatch call. I've tried EnsureDispatch as well, and more
>> recently the following code:
>>
>>> iab = IA.clsAuthorizeBatch()
>>> auth = DispatchEx(iab.CLSID)
>>
>> ... where I've imported the gen_py module under the name IA (I've
>> copied the module file to the same folder as the service, so there's
>> no issue with py2exe or the executable not being able to find it). In
>> this case, the hangup occurs in the first statement. I've tried
>> running the code with and without wrapping it in
>> CoInitialize/Couninitialize.
>>
>> I've run out of things I can think of to try, or even to get a hint of
>> what might be getting hung up. One last bit of data: looking at the
>> process in Process Explorer, I see that it's very busy for several
>> seconds (about 50% CPU), then goes quiet.
>>
>> Any good words appreciated,
>
> _______________________________________________
> python-win32 mailing list
> python-win32 at python.org
> http://mail.python.org/mailman/listinfo/python-win32



More information about the python-win32 mailing list