我有一个游戏服务器。我有一个工具,我用它来生成crc32 +时间戳并保存到文件..但这个脚本文件有更多的功能,我不想使用它们。我只需要获取crc32,时间戳并保存到文件。
我尝试删除这些函数,但不能正常工作,它会产生语法或其他错误。我试过100x ..我想在这里发帖,也许有人可以帮助我..
#!/usr/local/bin/python
from urllib import urlopen
from datetime import date
import sys
import os
import zlib
import getopt
import csv
import zipfile
#
# Utility functions
#
def FindFilesByExt(path, ext):
ext = ext.lower()
for root, dirs, files in os.walk(path):
for name in files:
if name[-len(ext):].lower() == ext:
yield os.path.join(root, name)
def GetFileCrc32(filename):
crc = 0
for line in open(filename, "rb"):
crc = zlib.crc32(line, crc)
return "%x" % (crc & 0xffffffff)
def FormatName(filename):
if filename[:2] == ".\\":
filename = filename[2:]
return filename.replace("\\", "/")
def GetLastModifiedTime(filename):
# http://support.microsoft.com/kb/167296
# How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME
EPOCH_AS_FILETIME = 116444736000000000 # January 1, 1970 as MS file time
HUNDREDS_OF_NANOSECONDS = 10000000
return EPOCH_AS_FILETIME + long(os.path.getmtime(filename)) * HUNDREDS_OF_NANOSECONDS
#
# Real code
#
class Patch:
def __init__(self):
self.name = None
self.patch_url = None
# Patch file list
self.file_dict = dict()
self.file_list = None
def SetName(self, name):
self.name = name
def SetPatchUrl(self, url):
self.patch_url = url
def AddFilesFromPatchUrl(self):
for line in urlopen(self.patch_url):
line = line.split()
print line
line[4] = FormatName(line[4])
self.file_dict[line[4].lower()] = line
def AddFile(self, filename):
filename = FormatName(filename)
mtime = GetLastModifiedTime(filename)
#
# Format is as following:
# unpacked_crc unpacked_size low_last_edit high_last_edit path
#
self.file_dict[filename.lower()] = [GetFileCrc32(filename),
"%d" % (os.path.getsize(filename)),
"%d" % (mtime >> 32),
"%d" % (mtime & 0xffffffff), filename]
# Sorted list no longer contains all files. Invalidate it.
self.file_list = None
def GetCrcList(self):
self.__SortFileList()
output = ""
for entry in self.file_list:
output += (" ".join(entry) + "\n")
return output
def __SortFileList(self):
if not self.file_list:
self.file_list = [self.file_dict[key] for key in self.file_dict]
self.file_list.sort(key=lambda entry: entry[4].lower()) # 4 = filename index
kPatchConfigFieldNames = ["Name", "Url"]
def GetPatchInstance(filename, desiredName):
with open(filename, 'r') as file:
reader = csv.DictReader(file, fieldnames=kPatchConfigFieldNames, dialect='excel-tab')
reader.next()
for row in reader:
if row["Name"] == desiredName:
patch = Patch()
patch.SetName(row["Name"])
patch.SetPatchUrl(row["Url"])
return patch
raise RuntimeError("Failed to find %s!" % (desiredName))
return None
def WriteXmlFile(filename, files):
file = open(filename, "wb+")
file.write('<ScriptFile>')
for f in files:
file.write('\t<CreateLz Input="%s" Output="%s.lz" />\n' % (f, f))
file.write('</ScriptFile>')
def main(argv):
#
# Parse command-line arguments
#
optlist, args = getopt.getopt(argv[1:], 'a:f:p:', ['archive=', 'file=', 'patchcfg='])
archives = list()
files = list()
patchConfigName = None
for name, value in optlist:
if name == "--archive" or name == "-a":
files.append("pack/" + value + ".eix")
files.append("pack/" + value + ".epk")
elif name == "--file" or name == "-f":
files.append(value)
elif name == "--patchcfg" or name == "-p":
patchConfigName = value
#
# Decide over patch-config to use...
#
patch = GetPatchInstance("PatchConfig.txt", patchConfigName)
# Add already existing files
patch.AddFilesFromPatchUrl()
# Process files
WriteXmlFile("make_patch.xml", files)
os.system("FileArchiver make_patch.xml")
os.unlink("make_patch.xml")
# Create patch ZIP
zip = zipfile.ZipFile("PATCH_%s_%s.zip" % (patchConfigName, date.today().strftime("%m%d%Y")), "w", zipfile.ZIP_DEFLATED)
for file in files:
patch.AddFile(file)
file = file + ".lz"
zip.write(file)
os.unlink(file)
zip.writestr("crclist", patch.GetCrcList())
zip.close()
main(sys.argv)
如果您想试用此脚本,请在cmd:
中运行此脚本python make_patch.py -f filename.extension -p patch_live
要运行此功能,它需要PatchConfig.txt
在同一个文件夹
答案 0 :(得分:0)
当你从脚本中删除函数时,你需要确保你删除的函数是而不是稍后在代码中调用。
例如,让我们说你的脚本如下:
def foo(x):
return x*x
def banana():
return "Peel"
def bar():
return "My " + banana()
i = int(raw_input("Please enter a number to be squared: "))
print foo(i) #prints the number you entered, squared
print banana() #prints "Peel"
print bar() #prints "My Peel"
因此,如果我只想要函数bar()
和foo(x)
的功能而且我不需要使用函数banana()
,我可以删除这些函数。但是,如果我仅删除函数banana()
,则会出现错误,如下所示:
def foo(x):
return x*x
#deleted banana()
def bar():
return "My " + banana()
i = int(raw_input("Please enter a number to be squared: "))
print foo(i) #prints the number you entered, squared
print banana() #gives an error because banana() is not defined
print bar() #not executed because of the above error.
让我们删除print banana()
并查看是否可以修复它。
def foo(x):
return x*x
#deleted banana()
def bar():
return "My " + banana()
i = int(raw_input("Please enter a number to be squared: "))
print foo(i) #prints the number you entered, squared
#deleted print banana()
print bar() #error because the bar() function calls the deleted banana() function
这仍然不起作用,因为bar()
函数在此处调用banana()
:
def bar():
return "My " + banana()
删除某个功能时,无论身在何处,都需要删除对该功能的每次调用。如果没有,Python将尝试调用一个不存在的函数,并会给你一个错误。删除banana()
所有痕迹的正确示例代码如下:
def foo(x):
return x*x
#deleted banana()
def bar():
return "My " + "Peel" # removed banana()
i = int(raw_input("Please enter a number to be squared: "))
print foo(i) #prints the number you entered, squared
#deleted print banana()
print bar() #prints "My Peel"
将此代码应用于代码时,请确保您要删除的任何函数(crc32函数)都不会直接调用您删除的函数。在我的示例中,如果您想保留bar()
函数,则banana()
函数实际上是运行bar()
所必需的,因此您不应删除它。
在您的代码中,AddFile
方法是您拨打GetFileCrc32()
时所呼叫的方法。如您所见,FormatName()
和GetLastModifiedTime()
也被调用。这些功能是GetFileCrc32()
工作所必需的,因此您不能删除它们。
def AddFile(self, filename):
filename = FormatName(filename)
mtime = GetLastModifiedTime(filename)
#
# Format is as following:
# unpacked_crc unpacked_size low_last_edit high_last_edit path
#
self.file_dict[filename.lower()] = [GetFileCrc32(filename),
"%d" % (os.path.getsize(filename)),
"%d" % (mtime >> 32),
"%d" % (mtime & 0xffffffff), filename]
# Sorted list no longer contains all files. Invalidate it.
self.file_list = None
我希望这有帮助!