Q:

How may one determine which version of Python is suitable for a script?

I want to determine which version of Python would be most appropriate for a Python script. Is there an automated way to do this?
The specific problem I have in mind is to determine which version of Python to use with the script (called ea800_downloader.py) shown here:
http://d.hatena.ne.jp/yamdan/20110129/1296320457
I ask because many errors are presented when I attempt to run it. I have tried running it with Python versions 2.6 and 2.7. The first of a list of errors is the following:
File "ea800_downloader.py", line 43
    "" "
       ^
SyntaxError: EOL while scanning string literal

In this case, it appears to be an attempt at a multiline comment but something's gone wrong somewhere. Any advice on this would be appreciated.
EDIT: As suggested, the code of the script is posted.
  # / Usr / bin / env python! 
  # - * - coding: UTF-8 - * -

  # 
  # Ea800_downloader.Py 
  # 
  # Usage: python Ea800_downloader.Py folder_id OUT_DIR 
  #    
  # folder_id: ID of the folder that you want to download (see below) 
  # 
  # | ID | folder path | 
  # | ---- + ------- ----------------------------- | 
  # | 0 | / ETablet / var / ebook | 
  # | two | / ETablet / var / photos | 
  # | 4 | / ETablet / var / Enotes | 
  # | 8 |? | 
  # | 12 | / ETablet / etc / db | 
  # | fourteen | / ETablet / etc / template | 
  # | 31 | / ETablet | 
  # | 32 | / usr / local / ETablet / bin | 
  # | thirty-three | / ETablet / etc | 
  # | 34 | / ETablet / var | 
  # | 35 | / usr / local / ETablet / lib | 
  # | 37 | / usr / local / ETablet / bin / Ebookreader | 
  # 
  # OUT_DIR: the directory where you want to store the folder where you downloaded 
  to make two directories xmlfiles and files directly under the # OUT_DIR directory 
  to store the downloaded file, to # files directory 
  to # xmlfiles directory stores (in the form of XML) list of files.

  Import sys
   Import os
   Import socket
   Import Xml.Etree.ElementTree as etree
   Import hashlib

  BUF_SIZE = 8192

  class  Connection (object):
      "" "
       . Simple wrapper class for Raw TCP Connection 
       Refer to: Http://Docs.Python.Org/howto/sockets.Html 

      Attributes: 
       - _Sock
       "" "

      def  __ init__ (self, address):
          self._sock = socket.socket ()
          self._sock.connect (address)

      def  Send (self, op):
          totalsent = 0
          op = Op.Encode (" UTF-8 ")
          op_size = len (op)
          while Totalsent <Op_size:
              sent = self._sock.send (op)
              if sent == 0:
                   raise RuntimeError, \ 
                      " socket Connection broken "
              totalsent = totalsent + sent

      def  recv (self, size = one):
          read = 0
          buf = []
          while read <size:
              data = self._sock.recv (BUF_SIZE)
              if Data == "":
                   raise RuntimeError, \ 
                      " socket Connection broken "
              read = read + len (data)
              buf.append (data)

          Return "". join (buf)

      def  close (self):
          self._sock.close ()

  class  Downloader (object):
      "" "
       File downloader for Eee Note EA800. 

      Attributes: 
       - _cs 
       - _DS 
       - _Files_folder 
       - _Xmlfiles_folder
       "" "

      def  __ init__ (self, OUT_DIR):
           # Connect to command socket 
          Connection Self._Cs = ((" 169.254.2.1 ", twenty thousand))
           # recieve welcome message
          self._cs.recv ()

          # Connect to Data socket 
          Connection Self._Ds = ((" 169.254.2.1 ", 20 001))
           # recieve welcome message
          self._cs.recv ()

          Self._Files_folder = os.path.join (OUT_DIR, " Files ")
          Self._Xmlfiles_folder = os.path.join (OUT_DIR, " Xmlfiles ")

      def  close (self):
           # close connections both
          self._ds.close ()
          self._cs.close ()

      def  _Md5sum (self, Data):
          m = hashlib.md5 ()
          m.update (data)
          Return M.Hexdigest ()

      def  downloadfile (self, folder_id, path):
          "" " EXECUTE 'downloadfile' command "" "

          # Send "downloadfile" request 
          op = " downloadfile \ n % d \ n Path =% s \ n \ \ n :: \ \ n "% (folder_id, path)
          self._cs.send (op)

          # Receive "downloadfilereturnvalue" response
          res = self._cs.recv ()
          Res.Split Res_list = (b " \ n ")

          assert Res_list [0] == " Downloadfilereturnvalue "," not correct response "

          # Extract status and file_size from "downloadfilereturnvalue" response
          status = res_list [1]
          file_size = int (res_list [2])
          MD5 = Res_list [three] [4:]   # drop first four character "MD5 ="

          assert file_size> 0, " file_size is not positive integer "

          # Prepare file and directory to output data
          outfile_path = os.path.join (self._files_folder,
                                      " % 02d "% folder_id,
                                      Path.Lstrip (" / "))
          outfile_dir = os.path.dirname (outfile_path)
          try :
              os.makedirs (outfile_dir)
          except OSError:
               pass

          # Output data to local directory
          data = self._ds.recv (file_size)
          assert Self._Md5sum (Data) == MD5, " invalid MD5 check sum "
          outfile = Open (Outfile_path, " wb ")
          outfile.write (data)
          outfile.close ()

          Print " Downloaded:% s "% path

      def  listfile (self, folder_id):
          "" " EXECUTE 'listfile' command "" "

          # Send "listfile" request 
          op = " listfile \ n % d \ n \ \ n :: \ \ n "% folder_id
          self._cs.send (op)

          # Receive "listfilereturnvalue" response
          res = self._cs.recv ()
          Res.Split Res_list = (b " \ n ")

          assert Res_list [0] == " Listfilereturnvalue "

          # Extract status and file_size from "listfilereturnvalue" response
          status = res_list [1]
          file_size = res_list [2]
          if File_size.Endswith (" \ \ n :: \ \ n "):
              file_size = file_size [: -6]
          file_size = int (file_size)

          assert file_size> 0

          # Output data to console
          data = self._ds.recv (file_size)
          Print Data

      def  xmlfile (self, folder_id):
          "" " EXECUTE 'xmlfile' command "" "

          # Send "xmlfile" request 
          op = " xmlfile \ n % d \ n \ \ n :: \ \ n "% folder_id
          self._cs.send (op)

          # Receive "xmlfilereturnvalue" response
          res = self._cs.recv ()
          Res.Split Res_list = (b " \ n ")

          assert Res_list [0] == " Xmlfilereturnvalue "

          # Extract status and file_size from "xmlfilereturnvalue" response
          status = res_list [1]
          file_size = res_list [2]
          file_size = int (file_size)

          assert file_size> 0

          # Prepare output to File and Directory Data 
          Outfile_path = os.path.join (Self._Xmlfiles_folder, " % 02D.Xml "% folder_id)
           try :
              os.makedirs (self._xmlfiles_folder)
          except OSError:
               pass

          # Output to local Data Directory 
          outfile = Open (Outfile_path, " wb ")
          data = self._ds.recv (file_size)
          outfile.write (data)
          outfile.close ()

          # Parse xmlfile
          tree = etree.parse (outfile_path)

          Return tree

      def  Downloadfolder (self, folder_id):
          "" " recursive download Files in a folder "" "

          tree = self.xmlfile (folder_id)
          self._traversal_and_download (tree.getroot (), u "", folder_id)

      def  _Traversal_and_download (self, Elm, folder_name, folder_id):
           if Elm.Tag == " File ":
              path = folder_name + u " / "+ Elm.Get (" name ")
               try :
                  self.downloadfile (folder_id, path)
              except AssertionError, e:
                   Print e
           else :
               for child in Elm.Getchildren ():
                  Self._Traversal_and_download (child, Elm.Get (" name ", u" "), folder_id)

  if __ name__ == " __ main__ ":
      folder_id = int (sys.argv [1])
      out_dir = sys.argv [2]

      d = Downloader (out_dir)
      d.downloadfolder (folder_id)
      d.close ()

A:

It looks like either a copy-and-paste error or an issue with the encodings. I went to the original site and the code runs just fine under Python 2.7.  You just need to fix the space between the three double-quotes.
To answer your original question, you can write check-syntax script that reads code to see which versions of Python can successfully compile the code.  If you can run compile(somescript, '', 'exec'), then is code is fine under the current version of Python.  This is strategy used by IDLE's checksyntax() function.

