ast*_*rog 9 python conflict module
我遇到了两个必须使用相同模块名称导入的Python模块,例如
import foo
Run Code Online (Sandbox Code Playgroud)
我知道我想要的那个提供某些功能(例如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
Run Code Online (Sandbox Code Playgroud)
这是一种方式:
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:]
Run Code Online (Sandbox Code Playgroud)
我打赌有一些角落我没有考虑,但希望这可以给你一些想法.
注意:我认为最好的想法是尽可能重命名模块.
注意2:正如我在你编辑的答案中所看到的,遗憾的是这个解决方案不起作用,因为这两个模块存在于同一目录(site-packages /)中.
由于 python 2.5 (和 PEP 328)绝对导入是管理 python 模块的首选方式。就您而言,您的模块树肯定是这样的:
/src/first_level/foo
/other_foo
/second_level/foo # with the bar method
Run Code Online (Sandbox Code Playgroud)
如果您想将 foo 模块与 bar 方法一起使用,请使用以下命令:
import second_level.foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6195 次 |
| 最近记录: |