2011-05-09 9 views
9

He encontrado dos módulos de Python que se deben importar con el mismo nombre de módulo, p. Ej.conflicto de nombre de módulo de Python

import foo 

sé que el que quiero proporciona ciertas funciones (por ejemplo foo.bar()), por lo que hay una manera para pasar por los módulos con el mismo nombre hasta que encuentre el que proporciona estas funciones? ¿O no hay otra alternativa que cambiar el nombre del módulo antes de la instalación?

Editar: sólo para aclarar lo que quiero decir, los dos módulos están dentro site-packages:

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 
+0

¿Hay algo que no le permita cambiar el nombre de su módulo? porque hasta donde sé, es fácil de resolver esta lata de problemas :) – mouad

+0

¿Dónde se encuentran estos módulos, por el camino? ¿Tiene uno en su directorio de paquetes de sitio y otro en el directorio actual (del archivo de importación)? En ese caso, es posible que pueda usar la importación absoluta para resolver el problema de ambigüedad. –

+0

Ambos módulos están dentro del directorio site-packages - He editado la pregunta para aclarar esto – astrofrog

Respuesta

0

Desde Python 2.5 (and PEP 328) la importación absoluta es la forma preferida de la gestión de módulos en Python. En su caso, su árbol módulo es ciertamente así:

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

Si desea utilizar el módulo foo con el método de barras, utilice esto:

import second_level.foo 
+0

No creo que pueda hacer esto porque es el nombre del módulo de nivel superior que es el mismo - He editado la pregunta para aclarar esto. – astrofrog

5

Aquí manera:

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 algunas esquinas que no tomé en consideración, pero espero que esto pueda darte una idea.

N.B: Creo que la mejor idea será cambiar el nombre del módulo si es posible.

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

+0

+1 por '__import__', no sabía que podía hacer una importación sin declaración y es lo que necesitaba. – keflavich

0

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

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

En su caso, aunque los dos huevos están en el camino pitón, creo que los huevos de hacer un poco de magia mediante el cual cada huevo actúa como un camino. Es posible que pueda establecer el archivo egg como argumento de ruta en imp.find_module para cargarlos por separado.

3

Existen formas de hackear los dos módulos con la misma limitación de nombre, pero a menos que lo haga simplemente con fines educativos, no lo recomendaría. El resultado final será confuso e inmanejable. Recomiendo encarecidamente cambiar el nombre de uno o ambos módulos en lugar de perder el tiempo con características poco claras relacionadas con la importación de Python.

Cuestiones relacionadas