3

I have two systems

  1. A Mac system running python 3.6.3
  2. A linux (ubuntu 14.04) sytem running python 3.4.3

I've been testing the following code segment on both systems to try and identify the cause of a bug on the ubuntu system.

import urllib.request
import http.server
import socketserver
PORT = 8000

def requestHandler(request, client_address,server):
    # test to print to console when the handler is invoked. 
    print("Request = " + str(request) + " Client Address = " + str(client_address) + " Server = " + str(server))

def startWebServer():
    Handler = requestHandler
    with socketserver.TCPServer(("", PORT), Handler) as httpd:
        print("serving at port", PORT)
        httpd.serve_forever()

def main():
    startWebServer()

main()

On the Mac this works as expected, invoking the requestHandler and printing information to the console.

However, on the ubuntu system I receive the following error.

Traceback (most recent call last):
  File "sockettest.py", line 19, in <module>
    main()
  File "sockettest.py", line 17, in main
    startWebServer()
  File "sockettest.py", line 12, in startWebServer
    with socketserver.TCPServer(("", PORT), Handler) as httpd:
AttributeError: __exit__

I am suspecting that I have misconfigured the ubuntu python installation.

Could you suggest what I might have done wrong?

jhpratt
  • 6,841
  • 16
  • 40
  • 50
Simon
  • 53
  • 1
  • 4

1 Answers1

7

socketserver servers don't support use as context managers before Python 3.6. Quoting the docs:

Changed in version 3.6: Support for the context manager protocol was added. Exiting the context manager is equivalent to calling server_close().

In the future, if different Python versions are behaving differently, you should check the docs to look for documented version differences.

user2357112
  • 260,549
  • 28
  • 431
  • 505