title: How to run Python CGI script
body: <p>I have never setup  a server (let alone a python server) before and i am a bit lost. How do i utilize the following code? I have tried to put in in the cgi bin directory but that didnt work. It returned an internal server error. have a look at this <a href="http://www.whatsupinamsterdam.co.nl/cgi-bin/server.py" rel="nofollow">here</a></p>
  
  <pre><code>#!/usr/bin/env python
  #
  # Funf: Open Sensing Framework
  # Copyright (C) 2010-2011 Nadav Aharony, Wei Pan, Alex Pentland.
  # Acknowledgments: Alan Gardner
  
  
  from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  from SocketServer import ThreadingMixIn
  import sys
  import cgi
  import urlparse
  import os.path
  import shutil
  import time
  
  server_dir = os.path.dirname(__file__)
  
  config_path = '/config'
  config_file_path = os.path.join(server_dir, 'config.json')
  
  upload_path = '/data'
  upload_dir = os.path.join(server_dir, 'uploads')
  
  def read_config():
      config = None
      try:
          with open(config_file_path) as config_file:
              config = config_file.read()
      except IOError:
          pass
      return config
  
  def backup_file(filepath):
      shutil.move(filepath, filepath + '.' + str(int(time.time()*1000)) + '.bak')
  
  def write_file(filename, file):
      if not os.path.exists(upload_dir):
          os.mkdir(upload_dir)
      filepath = os.path.join(upload_dir, filename)
      if os.path.exists(filepath):
          backup_file(filepath)
      with open(filepath, 'wb') as output_file:
          while True:
              chunk = file.read(1024)
              if not chunk:
                  break
              output_file.write(chunk)
  
  class RequestHandler(BaseHTTPRequestHandler):
  
      def do_GET(self):
          parsed_url = urlparse.urlparse(self.path)
          if parsed_url.path == config_path:
              config = read_config()
              if config:
                  self.send_response(200)
                  self.end_headers()
                  self.wfile.write(config)
              else:
                  self.send_error(500)
          elif parsed_url.path == upload_path:
              self.send_error(405)
          else:
              self.send_error(404)
  
      def do_POST(self):
          parsed_url = urlparse.urlparse(self.path)
          path = parsed_url.path
          ctype, pdict = cgi.parse_header(self.headers['Content-Type']) 
          if path == upload_path:
              if ctype=='multipart/form-data':
                  form = cgi.FieldStorage(self.rfile, self.headers, environ={'REQUEST_METHOD':'POST'})
                  try:
                      fileitem = form["uploadedfile"]
                      if fileitem.file:
                          try:
                              write_file(fileitem.filename, fileitem.file)
                          except Exception as e:
                              print e
                              self.send_error(500)
                          else:
                              self.send_response(200)
                              self.end_headers()
                              self.wfile.write("OK")
                          return
                  except KeyError:
                      pass
              # Bad request
              self.send_error(400)
          elif parsed_url.path == config_path:
              self.send_error(405)
          else:
              self.send_error(404)
  
  
  class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
      """Handle requests in a separate thread."""                
  
  
  if __name__ == '__main__':
      if sys.argv[1:]:
          port = int(sys.argv[1])
      else:
          port = 8000
      server_address = ('', port)
      httpd = ThreadedHTTPServer(server_address, RequestHandler)
  
      sa = httpd.socket.getsockname()
      print "Serving HTTP on", sa[0], "port", sa[1], "..."
      print 'use &lt;Ctrl-C&gt; to stop'
      httpd.serve_forever()
  </code></pre>