- #!/usr/bin/python
- ''' this file is used to find a class or function define file
- '''
- import sys
- import os
- import dircache
- pythonPath = list(set(sys.path))#delete repeat path
- currentPath = os.getcwd()
- print currentPath
- allPythonFiles = []
- def stdPath(listPath):
- '''this function is used to change path to absolute path, such "./abc"-->"/mycurrentdir/abc", and the
- function is also delete repeat path, such as './root and './root/' is regarded as same path
- '''
- global currentPath
- mylist = listPath
- retlist = []
- #strList = ';'.join(listPath)
- if not isinstance(listPath, list):
- print 'method is only surported for list type'
- return []
- for mypath in mylist:
- if len(mypath) == 0:
- mypath = currentPath
- elif mypath[0] != '/':
- if mypath[0] == '.':
- mypath = currentPath + mypath[1:]
- print mypath
- else:
- mypath = currentPath + mypath
- hasRepeat = False
- for mypath2 in retlist:
- if mypath2.find(mypath) >= 0 or mypath.find(mypath2) >=0:
- hasRepeat = True
- break
- if hasRepeat:
- continue
- retlist.append(mypath)
- return retlist
- def appendFolderFlag(folderstr):
- ''' if the folderstr is not ends with '/' ,we will append '\\' for the folderstr'''
- if folderstr.endswith('/'):
- return folderstr
- folderstr += '/'
- return folderstr
- def getPythonFilesIn(folder):
- ''' this function return all files end of '.py' in the folder
- Currently, this method doesn't surpport a link's folder
- '''
- folder = appendFolderFlag(folder)
- if not os.path.exists(folder):
- print 'folder :%s not found' % folder
- return []
- if not os.path.isdir(folder):
- print "current, method only surpports query under directory ,ensure % is a directory file" % (folder)
- return []
- pythonFiles = os.listdir(folder)
- filelist = []
- for myfile in pythonFiles:
- myfile = folder+myfile
- if os.path.isdir(myfile) or os.path.islink(myfile):
- continue
- if myfile.endswith('.py'):
- filelist.append(myfile)
- return filelist
- def getFoldersIn(folder):
- ''' this function get folders under the folder
- '''
- folder = appendFolderFlag(folder)
- if not os.path.exists(folder):
- print 'folder: %s not found' % folder
- return []
- if not os.path.isdir(folder):
- print 'ensure %s is a folder' % (folder)
- return []
- myfiles = os.listdir(folder)
- retvalue = []
- for mysubfolder in myfiles:
- mysubfolder = folder + appendFolderFlag(mysubfolder)
- if os.path.isdir(mysubfolder):
- retvalue.append(mysubfolder)
- return retvalue
- def getAllPythonFilesIn(folder):
- ''' this function get all python file *.py, include subfolder under the folder
- '''
- global allPythonFiles
- if not os.path.exists(folder):
- print 'folder :%s not found' % folder
- return []
- files = getPythonFilesIn(folder)
- allPythonFiles = allPythonFiles + files
- folders = getFoldersIn(folder)
- for mysubfolder in folders:
- getAllPythonFilesIn(mysubfolder)
- def hasTypeDefInFile(file, typename, whichtype='class'):
- ''' this method find python .py type file to find whether there typename define
- '''
- if not os.path.exists(file):
- print 'file : %s not found' % file
- return False
- content = ''
- findit = False
- try:
- f = open(file)
- content = f.read()
- except:
- raise ("can't read file %s" % file)
- else:
- f.close()
- for str in content.splitlines():
- if isDefLine(str,typename, whichtype): #start to judge if the line is a class define of typename
- findit = True
- return findit
- def isDefLine(str,defname,whichtype='class'):
- '''this function is used to if the str is a whichtyp define with name defname'''
- if whichtype == 'class':
- return isClassDefLine(str,defname)
- elif whichtype == 'function':
- return isFunctionDefLine(str,defname)
- else:
- print "currently,it doesn't surpport the type define judge: %s " % whichtype
- return False
- def isClassDefLine(linestr, typename):
- '''this class judge if linestr is a class define of typename
- '''
- linestr = linestr.lstrip()
- retvalue = False
- words = linestr.split()
- if len(words) >= 2 and words[0] == 'class':
- if words[1] == typename:
- retvalue = True
- if words[1].startswith(typename + '('):
- retvalue = True
- return retvalue
- def isFunctionDefLine(linestr, functionname):
- ''' this function is used to judge if linestr is a function define line'''
- linestr = linestr.lstrip()
- retvalue = False
- words = linestr.split()
- if len(words) >= 2 and words[0] == 'def':
- if words[1] == functionname:
- retvalue = True
- if words[1].startswith(functionname + '('):
- retvalue = True
- return retvalue
- def getAllPythonFilesInFolders(folders):
- ''' this function used to find all python file such as "name.py" style, it mainly
- call getAllPythonFileIn to implement this function
- '''
- folders = stdPath(folders)
- global allPythonFiles
- allPythonFiles = []
- for folder in folders:
- getAllPythonFilesIn(folder)
- def whereTypeDefInFiles(files, typename,whichtype='class'):
- ''' this function is used to get typename's class define by search all file in files
- it mainly call hasClassDefInFile()
- '''
- retvalue = []
- for file in files:
- if not os.path.exists(file):
- print "file :%s not found " (file)
- elif hasTypeDefInFile(file, typename,whichtype):
- retvalue.append(file)
- return retvalue
- def whereTypeDefInFolders(folders, typename,whichtype='class'):
- ''' this function is used to locate class position ,it mainly call hasClassDefInFiles'''
- getAllPythonFilesInFolders(folders)
- files = allPythonFiles
- return whereTypeDefInFiles(files, typename,whichtype)
- def printTypeDefPositionInFolders(folders,typename,whichtype='class'):
- '''just call whereTypeDefInFolders() to print results'''
- returnList = whereTypeDefInFolders(folders,typename,whichtype)
- print 'search result of %s %s is :' % (whichtype,typename)
- for position in returnList:
- print position
- printTypeDefPositionInFolders(pythonPath,'__init__','function')
- print hasTypeDefInFile("/usr/lib/python2.6/site-packages/slip/util/hookable.py","wrap_method", "function")
- print whereTypeDefInFolders(['/usr/lib/python2.6/site-packages'],'wrap_method','function')
- print whereTypeDefInFolders(['.'],'whereTypeDefInFolders','function')
- #该片段来自于http://www.codesnippet.cn/detail/180620134124.html
来源: http://www.codesnippet.cn/detail/180620134124.html