Conflicto de nombre de módulo de Python

Me he encontrado con dos módulos de Python que deben importarse utilizando el mismo nombre de módulo, por ejemplo,

import foo 

Sé que el que quiero proporciona ciertas funciones (por ejemplo, foo.bar() ), ¿hay alguna manera de recorrer los módulos con el mismo nombre hasta que encuentre el que proporciona esas funciones? ¿O no hay otra forma que no sea cambiar el nombre del módulo antes de instalarlo?

Edición: solo para aclarar lo que quiero decir, ambos módulos están dentro de los paquetes de sitio:

 site-packages$ ls python_montage-0.9.3-py2.6.egg EGG-INFO montage site-packages$ ls montage-0.3.2-py2.6.egg/ EGG-INFO montage 

Aquí hay una forma:

 import imp import sys def find_module(name, predicate=None): """Find a module with the name if this module have the predicate true. Arguments: - name: module name as a string. - predicate: a function that accept one argument as the name of a module and return True or False. Return: - The module imported Raise: - ImportError if the module wasn't found. """ search_paths = sys.path[:] if not predicate: return __import__(name) while 1: fp, pathname, desc = imp.find_module(name, search_paths) module = imp.load_module(name, fp, pathname, desc) if predicate(module): return module else: search_paths = search_paths[1:] 

Apuesto a que hay algunos rincones que no tomé en consideración, pero espero que esto pueda darte una idea.

NB: Creo que la mejor idea será simplemente cambiar el nombre de su módulo si es posible.

NB 2: Como veo en su respuesta editada, lamentablemente esta solución no funcionará porque los dos módulos existen en el mismo directorio (sitio-paquetes /).

Hay maneras de piratear los dos módulos con el mismo límite de nombre, pero a menos que lo haga simplemente con fines educativos, no lo recomendaría. El resultado final será confuso e inigualable. Recomiendo cambiar el nombre de uno o ambos módulos en lugar de perder el tiempo con las funciones relacionadas con la importación de Python.

Como Python 2.5 ( y PEP 328 ), la importación absoluta es la forma preferida de administrar módulos en Python. En tu caso, tu árbol de módulos es ciertamente así:

 /src/first_level/foo /other_foo /second_level/foo # with the bar method 

Si quieres usar el módulo foo con el método de la barra, usa esto:

 import second_level.foo 

Si está contento de poder averiguar los nombres de archivo a través de alguna otra heurística, entonces debería poder usar imp.load_module para cargarlos por separado.

Consulte http://docs.python.org/library/imp.html#imp.load_module

En tu caso, aunque ambos huevos están en el camino de los pitones, creo que los huevos hacen algo de magia, por lo que cada huevo actúa como un camino. Es posible que pueda establecer el archivo egg como el argumento de la ruta de imp.find_module en imp.find_module para cargarlos por separado.