mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 18:07:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """macmodulefinder - Find modules used in a script. Only slightly
 | |
| mac-specific, really."""
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| 
 | |
| import directives
 | |
| 
 | |
| try:
 | |
| 	# This will work if we are frozen ourselves
 | |
| 	import modulefinder
 | |
| except ImportError:
 | |
| 	# And this will work otherwise
 | |
| 	_FREEZEDIR=os.path.join(sys.prefix, ':Tools:freeze')
 | |
| 	sys.path.insert(0, _FREEZEDIR)
 | |
| 	import modulefinder
 | |
| 
 | |
| #
 | |
| # Modules that must be included, and modules that need not be included
 | |
| # (but are if they are found)
 | |
| #
 | |
| MAC_INCLUDE_MODULES=['site', 'macfsn']
 | |
| MAC_MAYMISS_MODULES=['posix', 'os2', 'nt', 'ntpath', 'dos', 'dospath', 
 | |
| 		'win32api', 'ce', '_winreg',
 | |
| 		'nturl2path', 'pwd', 'sitecustomize',
 | |
| 		'org.python.core',
 | |
| 		'riscos', 'riscosenviron', 'riscospath'
 | |
| 		]
 | |
| 
 | |
| # An exception:
 | |
| Missing="macmodulefinder.Missing"
 | |
| 
 | |
| class Module(modulefinder.Module):
 | |
| 	
 | |
| 	def gettype(self):
 | |
| 		"""Return type of module"""
 | |
| 		if self.__path__:
 | |
| 			return 'package'
 | |
| 		if self.__code__:
 | |
| 			return 'module'
 | |
| 		if self.__file__:
 | |
| 			return 'dynamic'
 | |
| 		return 'builtin'
 | |
| 
 | |
| class ModuleFinder(modulefinder.ModuleFinder):
 | |
| 
 | |
|     def add_module(self, fqname):
 | |
|         if self.modules.has_key(fqname):
 | |
|             return self.modules[fqname]
 | |
|         self.modules[fqname] = m = Module(fqname)
 | |
|         return m
 | |
|         
 | |
| def process(program, modules=None, module_files=None, debug=0):
 | |
| 	if modules is None:
 | |
| 		modules = []
 | |
| 	if module_files is None:
 | |
| 		module_files = []
 | |
| 	missing = []
 | |
| 	#
 | |
| 	# Add the standard modules needed for startup
 | |
| 	#
 | |
| 	modules = modules + MAC_INCLUDE_MODULES
 | |
| 	#
 | |
| 	# search the main source for directives
 | |
| 	#
 | |
| 	extra_modules, exclude_modules, optional_modules, extra_path = \
 | |
| 			directives.findfreezedirectives(program)
 | |
| 	for m in extra_modules:
 | |
| 		if os.sep in m:
 | |
| 			# It is a file
 | |
| 			module_files.append(m)
 | |
| 		else:
 | |
| 			modules.append(m)
 | |
|     # collect all modules of the program
 | |
| 	path = sys.path[:]
 | |
| 	dir = os.path.dirname(program)
 | |
| 	path[0] = dir	# "current dir"
 | |
| 	path = extra_path + path
 | |
| 	#
 | |
| 	# Create the module finder and let it do its work
 | |
| 	#
 | |
| 	modfinder = ModuleFinder(path, 
 | |
| 			excludes=exclude_modules, debug=debug)
 | |
| 	for m in modules:
 | |
| 		modfinder.import_hook(m)
 | |
| 	for m in module_files:
 | |
| 		modfinder.load_file(m)
 | |
| 	modfinder.run_script(program)
 | |
| 	module_dict = modfinder.modules
 | |
| 	#
 | |
| 	# Tell the user about missing modules
 | |
| 	#
 | |
| 	maymiss = exclude_modules + optional_modules + MAC_MAYMISS_MODULES
 | |
| 	for m in modfinder.badmodules.keys():
 | |
| 		if not m in maymiss:
 | |
| 			if debug > 0:
 | |
| 				print 'Missing', m
 | |
| 			missing.append(m)
 | |
| 	#
 | |
| 	# Warn the user about unused builtins
 | |
| 	#
 | |
| 	for m in sys.builtin_module_names:
 | |
| 		if m in ('__main__', '__builtin__'):
 | |
| 			pass
 | |
| 		elif not module_dict.has_key(m):
 | |
| 			if debug > 0:
 | |
| 				print 'Unused', m
 | |
| 		elif module_dict[m].gettype() != 'builtin':
 | |
| 			# XXXX Can this happen?
 | |
| 			if debug > 0:
 | |
| 				print 'Conflict', m
 | |
| 	return module_dict, missing
 | 
