Python中知識點筆記
Wentao Sun. Nov.14, 2008
來這個公司11個月了,最開始來的一個筆記本用完了,裡面都是工作時記錄的一些片段,看到一塊自己當時學/寫 python程式時記錄的筆記,決定放到
網上,供大家參考。
1. sys.prefix sys模組中的perfix屬性工作表示的是C:\Program files\python25,即python的安裝路徑;
2. python對一個module或軟體包安裝的方法是:python setup.py install,或者可以加入--prefix=/XXX表示安裝路徑。
在一些Linux平台或Mac OS X上,當無法開啟root賬戶時則可以將一些python系的軟體安裝到其他地方(except for /usr/lib or /usr/include).
3. python是case sensitive的,區分大小寫;
4. SCons中 Environment的使用,我摸索了很長時間才知道這點的:
env = SCons.Script.Environment()
5. frameworkversion=... framework是OS X中的一個概念,很多軟體模組在Mac OS X上都是以framework包為單位的;
6. 注意platform這一module;
7. python中使用unicode編程,在前面加一個'u'即可;
8. ../..表示向上跳兩層, ./表示目前的目錄, ../表示上一層;
9. 用CPPDEFINES表示preprocessor definitions部分;
10. 一些用用的程式碼片段(經過長期使用和測試的)
(1) 迴圈搜尋目錄,包括子路徑:
# Directory Walker is used to search all files in a sepecfied directory
class DirectoryWalker:
# a forward iterator that traverses a directory tree
def __init__(self, directory):
self.stack = [directory]
self.files = []
self.index = 0
def __getitem__(self, index):
while 1:
try:
file = self.files[self.index]
self.index = self.index + 1
except IndexError:
# pop next directory from stack
self.directory = self.stack.pop()
self.files = os.listdir(self.directory)
self.index = 0
else:
# got a filename
fullname = os.path.join(self.directory, file)
if os.path.isdir(fullname) and not os.path.islink(fullname):
self.stack.append(fullname)
if os.path.isfile(fullname):
return fullname
(2) 向一個VS工程檔案中添加你想加的東西
# Add preprocessor definition to project configurations in solution file
def AddPreprocessDefinition(projectFile, defList):
shutil.copyfile(projectFile, projectFile+".bak")
bakFile = projectFile+".bak"
bakHandle = open(bakFile,'r')
os.remove(projectFile)
projectHandle = open (projectFile, 'w+')
for line in bakHandle.readlines( ):
matchObj = re.match(r'(\s+)PreprocessorDefinitions="(.*)".*',line)
if matchObj:
prefixPart = matchObj.group(1)
predeflist = matchObj.group(2)
for predef in defList:
predeflist = predeflist + ';' + predef
projectHandle.write(prefixPart + r'PreprocessorDefinitions="' + \
predeflist+'"\n')
else:
projectHandle.write(line)
projectHandle.close()
bakHandle.close()
os.remove(bakFile)
(3) 從一個VS的solution檔案中返回一串vcproj檔案,或類似的情形
# return icproject files in solution files
def ProjectsInSolution(solutionFile, projPostFix):
projFileList = []
slnFileHandler = open(solutionFile, 'r')
fileContent = slnFileHandler.readlines()
for line in fileContent:
matchObj = re.match(r'^Project\(\"\{.*\}\"\) = \".*\", \"(.*)\", .*',line)
if matchObj:
origProjectFile = matchObj.groups(0)[0]
if os.path.splitext(origProjectFile)[1] != projPostFix:
continue
icProjectFile = os.path.dirname(solutionFile) + \
"\\" + os.path.splitext(origProjectFile)[0] + \
projPostFix
print icProjectFile
projFileList.append(icProjectFile)
slnFileHandler.close()
return projFileList
(4) 刪除檔案
#print iccprojects
for proj in iccprojects:
print proj
os.remove(proj.rstrip())
if os.access(proj, os.F_OK):
os.remove(proj.rstrip())
11. 注意python中list的append和extend方法的不同意義。
list = ['1', '2', '3']
list.append(['4', '5']) ==> list = ['1', '2', '3', ['4', '5']]
list.extend(['4', '5']) ==> list = ['1', '2', '3', '4', '5']
也就是說,在連結兩個鏈表的時候,extend是連結元素elements,而append則將一整個list append添加到它的後面。