mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Last week we discussed adding this module to the standard library.
Here's a draft. I have no immediate use for it, but I'd like this to be available for experimentation. I may withdraw it or change it radically up to and including the release of Python 2.3b1.
This commit is contained in:
		
							parent
							
								
									2736285035
								
							
						
					
					
						commit
						a4deda0d11
					
				
					 1 changed files with 78 additions and 0 deletions
				
			
		
							
								
								
									
										78
									
								
								Lib/pkgutil.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								Lib/pkgutil.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,78 @@ | ||||||
|  | """Utilities to support packages.""" | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | def extend_path(path, name): | ||||||
|  |     """Extend a package's path. | ||||||
|  | 
 | ||||||
|  |     Intended use is to place the following code in a package's __init__.py: | ||||||
|  | 
 | ||||||
|  |         from pkgutil import extend_path | ||||||
|  |         __path__ = extend_path(__path__, __name__) | ||||||
|  | 
 | ||||||
|  |     This will add to the package's __path__ all subdirectories of | ||||||
|  |     directories on sys.path named after the package.  This is useful | ||||||
|  |     if one wants to distribute different parts of a single logical | ||||||
|  |     package as multiple directories. | ||||||
|  | 
 | ||||||
|  |     It also looks for *.pkg files beginning where * matches the name | ||||||
|  |     argument.  This feature is similar to *.pth files (see site.py), | ||||||
|  |     except that it doesn't special-case lines starting with 'import'. | ||||||
|  |     A *.pkg file is trusted at face value: apart from checking for | ||||||
|  |     duplicates, all entries found in a *.pkg file are added to the | ||||||
|  |     path, regardless of whether they are exist the filesystem.  (This | ||||||
|  |     is a feature.) | ||||||
|  | 
 | ||||||
|  |     If the input path is not a list (as is the case for frozen | ||||||
|  |     packages) it is returned unchanged.  The input path is not | ||||||
|  |     modified; an extended copy is returned.  Items are only appended | ||||||
|  |     to the copy at the end. | ||||||
|  | 
 | ||||||
|  |     It is assumed that sys.path is a sequence.  Items of sys.path that | ||||||
|  |     are not (unicode or 8-bit) strings referring to existing | ||||||
|  |     directories are ignored.  Unicode items of sys.path that cause | ||||||
|  |     errors when used as filenames may cause this function to raise an | ||||||
|  |     exception (in line with os.path.isdir() behavior). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if not isinstance(path, list): | ||||||
|  |         # This could happen e.g. when this is called from inside a | ||||||
|  |         # frozen package.  Return the path unchanged in that case. | ||||||
|  |         return path | ||||||
|  | 
 | ||||||
|  |     pname = os.path.join(*name.split('.')) # Reconstitute as relative path | ||||||
|  |     # Just in case os.extsep != '.' | ||||||
|  |     sname = os.extsep.join(name.split('.')) | ||||||
|  |     sname_pkg = sname + os.extsep + "pkg" | ||||||
|  |     init_py = "__init__" + os.extsep + "py" | ||||||
|  | 
 | ||||||
|  |     path = path[:] # Start with a copy of the existing path | ||||||
|  | 
 | ||||||
|  |     for dir in sys.path: | ||||||
|  |         if not isinstance(dir, (str, unicode)) or not os.path.isdir(dir): | ||||||
|  |             continue | ||||||
|  |         subdir = os.path.join(dir, pname) | ||||||
|  |         # XXX This may still add duplicate entries to path on | ||||||
|  |         # case-insensitive filesystems | ||||||
|  |         initfile = os.path.join(subdir, init_py) | ||||||
|  |         if subdir not in path and os.path.isfile(initfile): | ||||||
|  |             path.append(subdir) | ||||||
|  |         # XXX Is this the right thing for subpackages like zope.app? | ||||||
|  |         # It looks for a file named "zope.app.pkg" | ||||||
|  |         pkgfile = os.path.join(dir, sname_pkg) | ||||||
|  |         if os.path.isfile(pkgfile): | ||||||
|  |             try: | ||||||
|  |                 f = open(pkgfile) | ||||||
|  |             except IOError, msg: | ||||||
|  |                 sys.stderr.write("Can't open %s: %s\n" % | ||||||
|  |                                  (pkgfile, msg)) | ||||||
|  |             else: | ||||||
|  |                 for line in f: | ||||||
|  |                     line = line.rstrip('\n') | ||||||
|  |                     if not line or line.startswith('#'): | ||||||
|  |                         continue | ||||||
|  |                     path.append(line) # Don't check for existence! | ||||||
|  |                 f.close() | ||||||
|  | 
 | ||||||
|  |     return path | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum