我遇到过两个必须使用相同模块名称导入的 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
这是一种方法:
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 2:正如我在您编辑的答案中看到的那样,遗憾的是这个解决方案将不起作用,因为这两个模块存在于同一目录(site-packages/)中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)