在不改变sys.path的情况下控制python中的导入顺序

时间:2014-06-10 01:27:26

标签: python python-2.7

我正在创建一个像这样的个人工具库

utils/
    __init__.py
    os.py
    sys.py
    string.py
    collections.py

我故意选择这些名字。

如果在任何这些模块中我想导入具有相同名称的标准库模块,我遇到了问题。例如,在我的collections.py中,我想要

import collections 

我希望这是标准库collections。麻烦的是 它会自行导入,即utils.collections,例如

   import string

将导入utils.string

有没有解决这个问题的方法?在这种情况下,推荐修改sys.path是推荐的解决方案。但是,对于utils中我首先执行的每个模块

,这都需要
   import sys 

这将导入utils.sys而不是我需要的sys。所以我又被卡住了。

1 个答案:

答案 0 :(得分:1)

最好的解决方案是首先防止这些名称冲突。但是,由于您可能已经超过了这一点(或者仅仅因为其他原因而必须使用这些名称),您可能不得不考虑使用Python 3.x' absolute_import代替:

from __future__ import absolute_import
import collections  # imports collections that is on sys.path
from . import collections as utils_collections  # now imports utils.collections

默认情况下,Python 2.x会在搜索sys.path之前搜索您的包。不幸的是,除了我上面说明的路线之外,在你的情况下除此之外没办法。

另一方面,Python 3.x将默认搜索sys.path中的绝对目录,除非前面有一个点。