[Twisted-Python] Suppressing terminal window from reactor.spawnProcess?

Steve Freitas sflist at ihonk.com
Mon Feb 5 04:47:21 EST 2007


On Fri, 2007-02-02 at 05:27 -0600, Eric Mangold wrote:
> > But when run as a service I suspect that the parent process (Twisted) is  
> > created DETACHED, so it doesn't have a console. But when you spawn a new  
> > child it just uses the defaults which then gives you a console.
> >
> > For what it's worth the win32 API flag of interest is DETACHED_PROCESS  
> > documented here: http://msdn2.microsoft.com/en-us/library/ms684863.aspx
> >
> > spawnProcess is currently slated for a redesign as per  
> > http://twistedmatrix.com/trac/ticket/2415
> >
> > I will make sure this concern is address in some form or fashion, but in  
> > the mean time you will have to do some work yourself if you really need  
> > this feature. Let use know if you get stuck :)
> 
> Actually CREATE_NO_WINDOW might be the flag you want. I'm not 100% sure  
> w/o running some tests.

Just to follow up for posterity, I ended up solving my problem.

First I overrode t.i.posixbase.PosixReactorBase.spawnProcess() with my
own function, the method for which now looks like:

def spawnProcess(self, processProtocol, executable, args=(),
	env={}, path=None, uid=None, gid=None, usePTY=0,
	childFDs=None, win32flags=0):

And inside spawnProcess(), when it goes to create a Process object, I
changed the line to read:

if win32process:
	return Process(self, processProtocol, executable, args,
		env, path, win32flags)

Then I overrode t.i._dumbwin32proc.Process' __init__ function, adding
win32flags to the end of the method's arguments as before, so it looks
like:

def __init__(self, reactor, protocol, command, args, environment,
	path, win32flags=0):

Then, I modded its nested doCreate() function's call to be:

def doCreate():
	self.hProcess, self.hThread, dwPid, dwTid = \
	win32process.CreateProcess(command, cmdline, None, None,
		1, win32flags, env, path, StartupInfo)

And now that I'm passing win32con.DETACHED_PROCESS into my new
spawnProcess(), it works perfectly. I've got stdin/out/err, a proper way
to kill the process I spawned, and no annoying shell window opening.
Just what I wanted for Christmas.

One question: I noticed that the posix reactor is what's running on
Windows -- under what condition does win32eventreactor.Win32Reactor
actually get installed?

Thanks again for your help with this,

Steve





More information about the Twisted-Python mailing list