Python模块名称冲突

时间:2011-05-09 13:46:11

标签: python module conflict

我遇到过两个必须使用相同模块名称导入的Python模块,例如

import foo

我知道我想要的那个提供某些功能(例如foo.bar()),那么有没有办法循环使用相同名称的模块,直到找到提供这些功能的模块?或者除了在安装之前重命名模块之外没有办法吗?

编辑:只是为了澄清我的意思,这两个模块都在网站包中:

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

4 个答案:

答案 0 :(得分:5)

这是一种方式:

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:]

我打赌有些角落我没有考虑过,但希望这可以给你一些想法。

N.B:我认为最好的办法就是尽可能重命名你的模块。

N.B 2:正如我在你编辑的答案中所看到的,遗憾的是这个解决方案不起作用,因为这两个模块存在于同一目录(site-packages /)中。

答案 1 :(得分:3)

有两种方法可以攻击具有相同名称限制的两个模块,但除非您仅仅出于教育目的而这样做,否则我不会推荐它。最终结果将是混乱和不可维护。我强烈建议重命名一个或两个模块,而不是弄乱晦涩的Python导入相关功能。

答案 2 :(得分:0)

因为python 2.5(and PEP 328)绝对导入是在python中管理模块的首选方式。 在您的情况下,您的模块树肯定是这样的:

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

如果要将foo模块与bar方法一起使用,请使用:

import second_level.foo

答案 3 :(得分:0)

如果您对通过其他启发式方法找出文件名感到高兴,那么您应该能够使用imp.load_module单独加载它们。

请参阅http://docs.python.org/library/imp.html#imp.load_module

在你的情况下,虽然两个鸡蛋都在蟒蛇的路径上,但我相信鸡蛋会产生一些魔力,每个鸡蛋都可以作为一条路径。您可以将egg文件设置为imp.find_module的路径参数,以便单独加载它们。