Python模块名confli

2024-04-18 02:23:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了两个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

Tags: 模块函数importinfo名称fooeggpackages
3条回答

有很多方法可以绕过这两个具有相同名称限制的模块,但除非您只是出于教育目的而这样做,否则我不建议您这样做。最终的结果将是混乱和无法维护的。我强烈建议重命名其中一个或两个模块,而不是混淆与Python导入相关的晦涩特性。

这里有一个方法:

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

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

注意:如果可能的话,我想最好的办法就是重新命名你的模块。

注意2:正如我在您编辑的答案中看到的,很遗憾,这个解决方案将无法工作,因为这两个模块存在于同一目录(site packages/)。

因为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

相关问题 更多 >