[Pythonmac-SIG] Again: EasyDialogs + Appscript + iPhoto = zombies!

Bob Ippolito bob at redivi.com
Tue Mar 8 02:01:12 CET 2005


It's a duplicate here...

You can't do a fork and then call into Carbon or Cocoa.  You can only 
call into Carbon or Cocoa in a fresh process.  You'll need to 
fork/execve instead.  Not sure if that will toss the zombies, but that 
is at least one thing wrong with this code.

-bob

On Mar 7, 2005, at 7:45 PM, Nathaniel Gray wrote:

> I sent this last week and haven't seen it come through on the list
> yet.  Sorry if it's a duplicate...
>
>
> ---------- Forwarded message ----------
> From: Nathaniel Gray <n8gray at gmail.com>
> Date: Wed, 2 Mar 2005 19:02:44 -0800
> Subject: EasyDialogs + Appscript + iPhoto = zombies!
> To: Pythonmac-Sig <pythonmac-sig at python.org>
>
>
> Hi,
>
> I've written a small appscript that exports an iPhoto album using the
> "album" photo album tool (written in Perl, but I don't have time to
> rewrite it... :-/).  I wrote the Python script and installed it as
> /Library/Scripts/Applications/iPhoto/iphoto2album so I can use it from
> the global Scripts menu.  It works fine, but it leaves a zombie Python
> process lying around every time I run it.  I don't know a whole lot
> about unix process control, but I found that to avoid zombie processes
> you need to "double-fork".  So here's a mock-up of my current code,
> mostly copied from
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012:
>
> #### BEGIN
> #! /usr/bin/env pythonw
> import os, sys
> import EasyDialogs as dialogs, datetime
> from appscript import *
> def main():
>     # This is obviously a dummy main function
>     errfile = open("/Users/n8gray/ip2a.errors", "w")
>     errfile.write("Made it!")
>     errfile.close()
>     dialogs.Message( "Everything works ok." )
>
> try:
>     pid = os.fork()
>     if pid > 0:
>         # exit first parent
>         sys.exit(0)
> except OSError, e:
>     print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, 
> e.strerror)
>     sys.exit(1)
>
> # decouple from parent environment
> #os.chdir("/")   # I've tried with and without this line.
> os.setsid()
> os.umask(0)
>
> # do second fork
> try:
>     pid = os.fork()
>     if pid > 0:
>         # exit from second parent, print eventual PID before
>         # print "Daemon PID %d" % pid
>         sys.exit(0)
> except OSError, e:
>     print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, 
> e.strerror)
>     sys.exit(1)
>
> # Open file descriptors
> if not sys.stderr: sys.stderr = sys.stdout
> si = file('/dev/null', 'r')
> so = file('/dev/null', 'a+')
> se = file('/dev/null', 'a+', 0)
>
> # Redirect standard file descriptors.
> os.dup2(si.fileno(), sys.stdin.fileno())
> os.dup2(so.fileno(), sys.stdout.fileno())
> os.dup2(se.fileno(), sys.stderr.fileno())
>
> # start the daemon main loop
> main()
> #### END
>
> Unfortunately, it still produces a zombie after each run and I don't
> see the dialog either.  The error log file does get written to,
> though, so I know the double-fork succeeds.
>
> Can anybody help me figure out what the problems are?  Also, is there
> any way to get rid of all the damn zombie processes on my system
> without rebooting?
>
> Thanks,
> -n8
>
> --
>>>> -- Nathaniel Gray -- Caltech Computer Science ------>
>>>> -- Mojave Project -- http://mojave.cs.caltech.edu -->
> _______________________________________________
> Pythonmac-SIG maillist  -  Pythonmac-SIG at python.org
> http://mail.python.org/mailman/listinfo/pythonmac-sig



More information about the Pythonmac-SIG mailing list