Menu

#239 atexit not called for pythonservice (win32)

open
None
5
2008-02-26
2005-08-26
Hari Dara
No

I have a couple of functions registered with atexit
which work fine when the program is executed on
command-line. But when I run the same as a windows
service, and stop the service using service interface,
these hooks never get call backs. The service does exit
normally (at least my program doesn't do os._exit() and
there are no exceptions).

I am using ActiveState's distribution of python, but I
would imagine this is non-specific. Here is the version
information:

ActivePython 2.4.1 Build 247 (ActiveState Corp.) based on
Python 2.4.1 (#65, Jun 20 2005, 17:01:55) [MSC v.1310
32 bit (Intel)] on win32

As a workaround I am calling the
atexit._run_exitfuncs() manually before returning from
SvcDoRun() for now.

Discussion

  • Hari Dara

    Hari Dara - 2006-01-12

    Logged In: YES
    user_id=344432

    Doesn't seem to be. In my case I don't see a call back at
    all, so the issue is not about when it gets called.

     
  • Richard Boulton

    Richard Boulton - 2007-10-18

    Logged In: YES
    user_id=9565
    Originator: NO

    This issue is still present. I have a minimal example which reproduces it which I will attach to this bug shortly.

    Note - regarding "woodsplitter"'s comment - I don't think this is related to the issue linked to there. As far as I can tell, the issue there is related to atexit being called in an order different to that expected, due to threading issues. In my minimal example, I have no threads involved; all my example code runs in SvcDoRun, in a single thread.

    I believe the problem is simply that, in src/PythonService.cpp, Py_Finalize() is never called. For example, in the main() function, Py_Initialize() is called near the start, but a corresponding Py_Finalize() is not called.

     
  • Richard Boulton

    Richard Boulton - 2007-10-18

    Logged In: YES
    user_id=9565
    Originator: NO

    Well, I can't see how to attach files to this report, though there is a line listing the number of attachments (listing it as 0, though).

    So, the example is at http://tartarus.org/~richard/test_service.py
    If I register and run the service (with "python test_service.py start" on the command line), I get two log entries - one saying "Started" and one saying "Stopping", 5 seconds later.

    If I uncomment the "sys.exitfunc()" line, I get an extra message "Atexit called", immediately after the "Stopping" message.

    I would expect to see the "Atexit called" message even with the call to "sys.exitfunc()" commented out.

    I don't have time to add Py_Finalize to PythonService.cpp and recompile, but I would imagine that that would cause the sys.exitfunc() to be called correctly - Py_Finalize is usually responsible for calling sys.exitfunc() to be called on interpreter shutdown.

     
  • Mark Hammond

    Mark Hammond - 2008-02-26
    • assigned_to: nobody --> mhammond
     
  • Mark Hammond

    Mark Hammond - 2008-02-26

    Logged In: YES
    user_id=14198
    Originator: NO

    Just a ping - the fix here isn't obvious given we may have multiple services in an executable. I'm confident there are reasonable work-arounds, so punting again (at least until we do host multiple services in 1 .exe)

     
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.