cpython-issue11638 / Lib / addpack.py

The branch 'legacy-trunk' does not exist.
# This module provides standard support for "packages".
#
# The idea is that large groups of related modules can be placed in
# their own subdirectory, which can be added to the Python search path
# in a relatively easy way.
#
# The current version takes a package name and searches the Python
# search path for a directory by that name, and if found adds it to
# the module search path (sys.path).  It maintains a list of packages
# that have already been added so adding the same package many times
# is OK.
#
# It is intended to be used in a fairly stylized manner: each module
# that wants to use a particular package, say 'Foo', is supposed to
# contain the following code:
#
#   from addpack import addpack
#   addpack('Foo')
#   <import modules from package Foo>
#
# Additional arguments, when present, provide additional places where
# to look for the package before trying sys.path (these may be either
# strings or lists/tuples of strings).  Also, if the package name is a
# full pathname, first the last component is tried in the usual way,
# then the full pathname is tried last.  If the package name is a
# *relative* pathname (UNIX: contains a slash but doesn't start with
# one), then nothing special is done.  The packages "/foo/bar/bletch"
# and "bletch" are considered the same, but unrelated to "bar/bletch".
#
# If the algorithm finds more than one suitable subdirectory, all are
# added to the search path -- this makes it possible to override part
# of a package.  The same path will not be added more than once.
#
# If no directory is found, ImportError is raised.

_packs = {}				# {pack: [pathname, ...], ...}

def addpack(pack, *locations):
	import os
	if os.path.isabs(pack):
		base = os.path.basename(pack)
	else:
		base = pack
	if _packs.has_key(base):
		return
	import sys
	path = []
	for loc in _flatten(locations) + sys.path:
		fn = os.path.join(loc, base)
		if fn not in path and os.path.isdir(fn):
			path.append(fn)
	if pack != base and pack not in path and os.path.isdir(pack):
		path.append(pack)
	if not path: raise ImportError, 'package ' + pack + ' not found'
	_packs[base] = path
	for fn in path:
		if fn not in sys.path:
			sys.path.append(fn)

def _flatten(locations):
	locs = []
	for loc in locations:
		if type(loc) == type(''):
			locs.append(loc)
		else:
			locs = locs + _flatten(loc)
	return locs
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.