1

我想确定哪个版本的 Python 最适合 Python 脚本。有没有一种自动化的方法来做到这一点?

我想到的具体问题是确定与此处显示的脚本(称为 ea800_downloader.py)一起使用的 Python 版本:

http://d.hatena.ne.jp/yamdan/20110129/1296320457

我问是因为当我尝试运行它时会出现许多错误。我尝试使用 Python 2.6 和 2.7 版本运行它。错误列表中的第一个如下:

File "ea800_downloader.py", line 43
    "" "
       ^
SyntaxError: EOL while scanning string literal

在这种情况下,这似乎是对多行注释的尝试,但某处出了点问题。对此的任何建议将不胜感激。

编辑:正如建议的那样,脚本的代码已发布。

  # / 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 ()
4

2 回答 2

1

该代码似乎有语法错误。"" "在任何版本的 Python 中都不是有效的语法。您需要修复代码或尝试重新下载。尝试其他版本的 Python 将无济于事。您很可能需要删除引号之间的空格。如果您复制并粘贴了代码,您可能需要稍微修正一下格式。

于 2013-04-01T01:09:24.617 回答
1

它看起来像是复制粘贴错误或编码问题。我去了原始站点,代码在 Python 2.7 下运行得很好。您只需要修复三个双引号之间的空格。

要回答您最初的问题,您可以编写检查语法脚本来读取代码,以查看哪些版本的 Python 可以成功编译代码。如果可以运行compile(somescript, '', 'exec'),那么在当前版本的 Python 下代码是可以的。这是IDLE 的checksyntax()函数使用的策略。

于 2013-04-01T01:11:39.000 回答