我想确定哪个版本的 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 ()