Problem with py2exe-frozen CGIHttpServer-based script

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • vincent wehren

    Problem with py2exe-frozen CGIHttpServer-based script

    Hi,

    as a small capabilities demo I coded the piece below to show how to use
    Python for cgi'ing on localhost and it more or less does the trick :-).
    However, I when I freeze it with py2exe, starting the resulting exe fires up
    the server allright,
    but fails execute cgi commands correctly (i.e. the expected output - let's
    say from cgi.test()) - is no longer emitted to the browser...).

    Is there some py2exe-magic I need to do that I don't know of? Something in
    the code that prevents the frozen version to work?


    Any pointers would be much appreciated...

    Python 2.3.2 , Py2exe 0.4.2, Win XP

    Here's the code...:


    import CGIHTTPServer, BaseHTTPServer, SimpleHTTPServe r
    import threading
    import sys

    port=8000

    # nicked from the SimpleHTTPServe r test rig
    def simple( HandlerClass = SimpleHTTPServe r.SimpleHTTPReq uestHandler
    ,ServerClass = BaseHTTPServer. HTTPServer):
    """
    """

    base(HandlerCla ss, ServerClass)


    # nicked from the BaseHTTPServer test rig
    def base(HandlerCla ss = BaseHTTPServer. BaseHTTPRequest Handler,
    ServerClass = BaseHTTPServer. HTTPServer, protocol="HTTP/1.0"):
    """
    """

    server_address = ('localhost', port)
    HandlerClass.pr otocol_version = protocol
    try:
    httpd = ServerClass(ser ver_address, HandlerClass)
    sa = httpd.socket.ge tsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_for ever()
    except KeyboardInterru pt:
    http.socket.clo se()



    def RunServer(ready Event=None
    ,HandlerClass = CGIHTTPServer.C GIHTTPRequestHa ndler
    ,ServerClass = BaseHTTPServer. HTTPServer):

    simple(HandlerC lass, ServerClass)
    if readyEvent:
    readyEvent.set( )

    def main():

    testServerReady = threading.Event ()
    threading.Threa d(target=RunSer ver, args=(testServe rReady,)).start ()
    testServerReady .wait()


    if __name__ == '__main__':
    main()








  • Thomas Heller

    #2
    Re: Problem with py2exe-frozen CGIHttpServer-based script

    "vincent wehren" <vincent@visual trans.de> writes:
    [color=blue]
    > Hi,
    >
    > as a small capabilities demo I coded the piece below to show how to use
    > Python for cgi'ing on localhost and it more or less does the trick :-).
    > However, I when I freeze it with py2exe, starting the resulting exe fires up
    > the server allright,
    > but fails execute cgi commands correctly (i.e. the expected output - let's
    > say from cgi.test()) - is no longer emitted to the browser...).
    >
    > Is there some py2exe-magic I need to do that I don't know of? Something in
    > the code that prevents the frozen version to work?[/color]

    That's an easy one!
    Look into CGIHTTPServer.p y, near line 232:
    if self.is_python( scriptfile):
    => interp = sys.executable
    if interp.lower(). endswith("w.exe "):
    # On Windows, use python.exe, not pythonw.exe
    interp = interp[:-5] + interp[-4:]
    cmdline = "%s -u %s" % (interp, cmdline)

    It tries to start 'sys.executable ' with the python cgi script. Normally
    sys.executable is the Python interpreter, but for a py2exe'd script this
    is the running executable (which is no longer a usual Python
    interpreter).

    Changing this line to 'interp = r"c:\python23\p ython.exe"' makes the
    frozen script work (although then the Python installation is required
    again).

    (A few minutes later, looking at CGIHTTPServer.p y again)
    It seems you have to hack this module so that the code block starting at
    line 270 is used, which says:
    else:
    # Other O.S. -- execute script in this process
    and then it works fine.

    Thomas

    Comment

    • Will Stuyvesant

      #3
      Re: Problem with py2exe-frozen CGIHttpServer-based script

      Look at this piece of code in my *modified* CGIHTTPServer.p y:

      if self.is_python( scriptfile):
      # THIS DOESN'T WORK AFTER PY2EXE!
      #interp = sys.executable
      #if interp.lower(). endswith("w.exe "):
      # # On Windows, use python.exe, not pythonw.exe
      # interp = interp[:-5] + interp[-4:]
      #cmdline = "%s -u %s" % (interp, cmdline)
      cmdline = "%s -u %s" % ('distpython', cmdline)

      The comments have the "original" standard library code. It uses
      sys.executable, and that returns "yourCGIProg.ex e" instead of
      "Python.exe " or something like that, as you need for running the CGI
      program.

      My *modified* version works when used by some *.exe generated by
      py2exe.

      --
      Man is the only animal that blushes -- or needs to.
      -- Mark Twain

      Comment

      • vincent wehren

        #4
        Re: Problem with py2exe-frozen CGIHttpServer-based script

        "Thomas Heller" <theller@python .net> schrieb im Newsbeitrag
        news:isl66xxj.f sf@python.net.. .
        | "vincent wehren" <vincent@visual trans.de> writes:
        |
        | > Hi,
        | >
        | > as a small capabilities demo I coded the piece below to show how to use
        | > Python for cgi'ing on localhost and it more or less does the trick :-).
        | > However, I when I freeze it with py2exe, starting the resulting exe
        fires up
        | > the server allright,
        | > but fails execute cgi commands correctly (i.e. the expected output -
        let's
        | > say from cgi.test()) - is no longer emitted to the browser...).
        | >
        | > Is there some py2exe-magic I need to do that I don't know of? Something
        in
        | > the code that prevents the frozen version to work?
        |
        | That's an easy one!
        | Look into CGIHTTPServer.p y, near line 232:
        | if self.is_python( scriptfile):
        | => interp = sys.executable
        | if interp.lower(). endswith("w.exe "):
        | # On Windows, use python.exe, not pythonw.exe
        | interp = interp[:-5] + interp[-4:]
        | cmdline = "%s -u %s" % (interp, cmdline)
        |
        | It tries to start 'sys.executable ' with the python cgi script. Normally
        | sys.executable is the Python interpreter, but for a py2exe'd script this
        | is the running executable (which is no longer a usual Python
        | interpreter).
        |
        | Changing this line to 'interp = r"c:\python23\p ython.exe"' makes the
        | frozen script work (although then the Python installation is required
        | again).
        |
        | (A few minutes later, looking at CGIHTTPServer.p y again)
        | It seems you have to hack this module so that the code block starting at
        | line 270 is used, which says:
        | else:
        | # Other O.S. -- execute script in this process
        | and then it works fine.
        |
        | Thomas


        Hi Thomas,

        I suspected something along those lines....

        I'll give the hack a go!

        Thanks!

        Vincent





        Comment

        Working...