[Twisted-Python] Windows issues...

Andrew Bennetts andrew-twisted at puzzling.org
Mon Feb 18 19:24:35 EST 2002


On Mon, Feb 18, 2002 at 06:34:33PM -0500, Benjamin Schollnick wrote:
> Folks,
> 
>    I've got some questions, with windows usage of Twisted Matrix...

I use Twisted under Windows, so I may be able to offer some help..

> 1) setup.py install    died....It stopped when it couldn't find "CL.EXE",
> while building
>    something in the twisted.spread.cbanana section...

CL.EXE is a command line program that comes with MS Visual C++...  setup.py
is basically trying to compile a C extension module.  I can send you a
binary for that file if you don't have MS VC++ installed, otherwise run
VCVARS32.BAT and try again. 

> 2) A lot of the files, don't have a .py extension.  (i.e. mktap, twistd,
> etc)
>    This is a major hindrance, because either I have to rename the file, or
>    execute it explicitly "python mktap ....etc....".  I have windows set to
> run
>    the .py files via python automatically.

This is easily fixed with short bash script, but I agree, this is annoyed.

I'd suggest the Twisted developers look at how, e.g. PyChecker or Teud does
it (various scripts get installed in %PYTHONPATH%/scripts/<foo>.bat).

> 3) web.distrib has some issues.  Mainly attempting to use the pwd unit under
[snip]
> 4) Error checking is extremely light....
[snip]
> 5) Even after fixing #3, mktap web --static static, isn't working.

I don't use the twisted.web stuff (yet ;), so I can't offer any help here :(

> 6) Under Windows, the default should be -n for twistd, and the PID file
> shouldn't be created.   At least, as it is now.  twistd just "stops", after
> it starts up and drops us back to the command line, and examination shows
> that the program isn't running.  So at least as a workaround, the -n mode
> works....

Yeah, -n uses os.fork, which is not available under Windows.  You probably
need to use NT services instead...

Alternatively, consider using the cygwin version of Python -- it is closer
to the unix version, and so os.fork will work.  Also, it comes with gcc, so
cbanana would compile correctly.  Unfortunately, I don't think it can
interoperate with the Win32 extensions (at least, not that I know of).

> I guest a better question is, has twistedmatrix been tested under Windows?
> It really seems to be unix centric in it's programming...

It basically works.  The other problem to watch out for is that
Protocol.connectionFailed won't trigger unless you specify a timeout for
your tcp.Client, because select works slightly differently on Windows.

Incidentally, I'm not using the twistd stuff *at all* (I don't yet
understand the need for it under Windows, but then I don't even know exactly
what it's meant to do...).  Instead, I'm using this little file:

--- ServerFramework/Service.py ---
import win32serviceutil, win32service

"""Example use of this module:

from ServerFramework.Service import Service, main
import ExampleServer

class ExampleServerService(Service):
    _svc_name_ = "ExampleServerService"
    _svc_display_name_ = "My Example Server Service"
    main = ExampleServer.main

if __name__ == '__main__':
    main(ExampleServerService)
"""


try:
    import twisted
except ImportError:
    print "Twisted Python must be installed to run this service"
    raise

class Service(win32serviceutil.ServiceFramework):
    """I am a template service for ServerFramework servers.
    
    You should subclass me and override the following attributes:
        _svc_name_          -- see win32serviceutil docs
        _svc_display_name_  -- see win32serviceutil docs
        main                -- function that starts your server
    
    You can also override:
        logFile             -- filename for where debug messages will be saved
                               (default: c:/<_svc_name_>.log)
    """
    _svc_name_ = "UnnamedServer"
    _svc_display_name_ = "My UNNAMED Server"
    main = None
    logFile = None

    def __init__(self, *args):
        win32serviceutil.ServiceFramework.__init__(self, *args)
        if not self.logFile:
            self.logFile = 'c:/%s.log' % (self._svc_name_,)

    def SvcDoRun(self):
        from twisted.python.log import startLogging
        startLogging(open(self.logFile,'a'))
        # Call main, note that it is not a method of this class, so we use
        # self.main.im_func() instead of self.main().
        self.main.im_func()

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        from twisted.internet.main import shutDown
        shutDown()

def main(svc):
	win32serviceutil.HandleCommandLine(svc)
    
if __name__ == '__main__':
    print "This is a library module, and should not be executed."
---

It basically wraps up the functionality of the win32serviceutil in a
convenient way for Twisted servers.  Once you've used it as shown in the
example, just run it from the commandline -- it's self explantory (it uses
Mark Hammond's win32serviceutil.HandleCommandLine function to let you
install the service).  I'm not sure if the self.main.im_func trick will work
on older Pythons; I use 2.2.

I hope this is of some use to you.

-Andrew.





More information about the Twisted-Python mailing list