[python-win32] Strange order of OnEnter/LeaveScript site methods in application hosting Python active scripting engine

Milan Kaše milan.kase at gmail.com
Sun Jun 2 13:54:45 CEST 2013


These events are (actually were) quite reliable way to determine when the
actual script execution begins/ends among various (buggy) scripting engine.
The application uses these events to change the state of the GUI. This does
not work any more correctly with Python.

IMHO Python's implementation violates the contract documented in MSDN
(linked in my first post) and deviates from implementations of other
engines (tested with JScript, VBScript, Ruby, PHP, Lua).

--
Milan


2013/5/31 Mark Hammond <mhammond at skippinet.com.au>

> On 31/05/2013 5:33 AM, Milan Kaše wrote:
>
>> I tried to take stack dumps (attached bellow) and it seems that the
>> first pair of calls is coming from CompileInScriptedSection while the
>> second pair is from ExecInScriptedSection. Do you have a clue what's
>> going on here?
>>
>
> Right - script blocks are compiled before they are executed.  I really
> can't remember why the compilation step does this - what problem is it
> causing you?
>
> Mark
>
>>
>> 0.00000000*** OnEnterScript ***
>>
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 0.00142864   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 0.00142864   return func(*args)
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 610, in SetScriptState
>> 0.00142864   self.Run()
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 788, in Run
>> 0.00142864   self.ExecutePendingScripts()
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 736, in ExecutePendingScripts
>> 0.00142864   self.DoExecutePendingScripts()
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**
>> client\pyscript.py",
>> line 237, in DoExecutePendingScripts
>> 0.00142864   if self.CompileInScriptedSection(**codeBlock, "exec"):
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 872, in CompileInScriptedSection
>> 0.00142864   self.BeginScriptedSection()
>> 0.00142864 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 972, in BeginScriptedSection
>> 0.00142864   win32api.OutputDebugString("".**
>> join(traceback.format_stack())**)
>> 0.00574597*** OnLeaveScript ***
>>
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 0.00618566   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 0.00618566   return func(*args)
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 610, in SetScriptState
>> 0.00618566   self.Run()
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 788, in Run
>> 0.00618566   self.ExecutePendingScripts()
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 736, in ExecutePendingScripts
>> 0.00618566   self.DoExecutePendingScripts()
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**
>> client\pyscript.py",
>> line 237, in DoExecutePendingScripts
>> 0.00618566   if self.CompileInScriptedSection(**codeBlock, "exec"):
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 880, in CompileInScriptedSection
>> 0.00618566   self.EndScriptedSection()
>> 0.00618566 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 979, in EndScriptedSection
>> 0.00618566   win32api.OutputDebugString("".**
>> join(traceback.format_stack())**)
>> 0.00675985*** OnEnterScript ***
>>
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 0.00718076   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 0.00718076   return func(*args)
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 610, in SetScriptState
>> 0.00718076   self.Run()
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 788, in Run
>> 0.00718076   self.ExecutePendingScripts()
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 736, in ExecutePendingScripts
>> 0.00718076   self.DoExecutePendingScripts()
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**
>> client\pyscript.py",
>> line 238, in DoExecutePendingScripts
>> 0.00718076   self.ExecInScriptedSection(**codeBlock, globs)
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 899, in ExecInScriptedSection
>> 0.00718076   self.BeginScriptedSection()
>> 0.00718076 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 972, in BeginScriptedSection
>> 0.00718076   win32api.OutputDebugString("".**
>> join(traceback.format_stack())**)
>> 3.00900340*** OnLeaveScript ***
>>
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 3.00964451   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 3.00964451   return func(*args)
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 610, in SetScriptState
>> 3.00964451   self.Run()
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 788, in Run
>> 3.00964451   self.ExecutePendingScripts()
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 736, in ExecutePendingScripts
>> 3.00964451   self.DoExecutePendingScripts()
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**
>> client\pyscript.py",
>> line 238, in DoExecutePendingScripts
>> 3.00964451   self.ExecInScriptedSection(**codeBlock, globs)
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 905, in ExecInScriptedSection
>> 3.00964451   self.EndScriptedSection()
>> 3.00964451 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 979, in EndScriptedSection
>> 3.00964451   win32api.OutputDebugString("".**
>> join(traceback.format_stack())**)
>> 3.01041079pythoncom error:
>> 3.01048589Unexpected exception in gateway method 'SetScriptSite'
>> 3.01056170
>> 3.01062036
>> 3.01094675Traceback (most recent call last):
>>
>> 3.01094675 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 3.01094675   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 3.01094675 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 3.01094675   return func(*args)
>> 3.01094675 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 580, in SetScriptSite
>> 3.01094675   self.lcid = site.GetLCID()
>> 3.01094675AttributeError: 'NoneType' object has no attribute 'GetLCID'
>>
>> 3.01102114pythoncom error:
>> 3.01107931Unexpected gateway error
>> 3.01122880
>> 3.01147223
>> 3.01194453Traceback (most recent call last):
>>
>> 3.01194453 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 324,
>> in
>> _InvokeEx_
>> 3.01194453   return self._invokeex_(dispid, lcid, wFlags, args, kwargs,
>> serviceProvider)
>> 3.01194453 File
>> "C:\Python27\lib\site-**packages\win32com\server\**policy.py", line 585,
>> in
>> _invokeex_
>> 3.01194453   return func(*args)
>> 3.01194453 File
>> "C:\Python27\lib\site-**packages\win32comext\axscript\**client\framework.py",
>> line
>> 580, in SetScriptSite
>> 3.01194453   self.lcid = site.GetLCID()
>> 3.01194453AttributeError: 'NoneType' object has no attribute 'GetLCID'
>>
>>
>>
>> 2013/5/30 Mark Hammond <skippy.hammond at gmail.com
>> <mailto:skippy.hammond at gmail.**com <skippy.hammond at gmail.com>>>
>>
>>
>>     Apart from the engine being called with no script to execute for
>>     some reason, it may be that an event handler is being added, which
>>     causes Python to execute things twice - once to "build" the event
>>     handler, and again when it is actually executed.
>>
>>     Either way, if you check out
>>     win32comext/axscript/client/__**framework.py and look for
>>
>>     ApplyInScriptedSection(), you will find where these calls originate
>>     from.  If you can print (or otherwise arrange to see) what the code
>>     is, it might give us more of a clue.
>>
>>     HTH,
>>
>>     Mark
>>
>>
>>     On 30/05/2013 3:34 AM, Milan Kaše wrote:
>>
>>         Hello,
>>         a user of our application which can host various active scripting
>>         engines reported problems when using the application together with
>>         Python active scripting engine. I traced the problem down to the
>>         order
>>         in which the engine calls the site's OnEnterScript/OnLeaveScript
>>         methods.
>>
>>         The usual scenario with other engines (including MS JScript and
>>         VBScript) is:
>>         1. OnEnterScript
>>         2. ...executing script...
>>         3. OnLeaveScript
>>
>>         However with Python engine, after calling
>>         IActiveScript.SetScriptState(_**_SCRIPTSTATE_CONNECTED) the
>>
>>         scenario is
>>         following:
>>         1. OnEnterScript
>>         2. OnLeaveScript
>>         3. OnEnterScript
>>         4. ...executing script...
>>         5. OnLeaveScript
>>
>>         One would expect either the first scenario or in case the events
>> are
>>         raised multiple times, then the calls should be nested (as stated
>> in
>>         MSDN,
>>         http://msdn.microsoft.com/en-_**_us/library/9c1cww48(v=vs.94).**
>> __aspx<http://msdn.microsoft.com/en-__us/library/9c1cww48(v=vs.94).__aspx>
>>         <http://msdn.microsoft.com/en-**us/library/9c1cww48(v=vs.94).**
>> aspx <http://msdn.microsoft.com/en-us/library/9c1cww48(v=vs.94).aspx>>).
>>
>>         Is the Python's way of calling these methods intentional or is
>>         it a bug?
>>
>>         Thanks,
>>         Milan
>>
>>
>>         ______________________________**___________________
>>         python-win32 mailing list
>>         python-win32 at python.org <mailto:python-win32 at python.**org<python-win32 at python.org>
>> >
>>         http://mail.python.org/__**mailman/listinfo/python-win32<http://mail.python.org/__mailman/listinfo/python-win32>
>>         <http://mail.python.org/**mailman/listinfo/python-win32<http://mail.python.org/mailman/listinfo/python-win32>
>> >
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20130602/37bb9b14/attachment-0001.html>


More information about the python-win32 mailing list