在PYTHONPATH元素顶部导入两个具有相同名称的模块

时间:2019-11-05 20:19:06

标签: python python-import python-2.6

我将简化表示法。我有

PYTHONPATH=/path1/dir1:/path2/dir2

结构:

/path1/dir1/
    README
    muggle.py
    ...
    utils/

/path2/dir2/
    __init__.py
    utils/
        __init__.py
        pkg2/
            __init__.py
            mod2.py

dir1有一个模块utils,但它本身不是一个包:没有__init__.py
dir2具有模块utils,而确实具有__init__.py

我的样板代码(在dir1是环境的一部分之前)是从dir2导入的,格式为

from utils.pkg2.mod2 import func2

问题来了,我现在正在修改此代码以调用从utils中的dir1导入的函数;我无法改变那部分环境。

我该怎么做才能使代码进入dir2/utils模块?不幸的是,这还需要适应Python 2.6.6及更高版本。

我正在搜索关于SO和其他地方的现有问题;我找到的所有答案都取决于我没有的某些软件包“句柄”。

1 个答案:

答案 0 :(得分:1)

此导入语句不正确:

from utils.pkg2.mod2 import func2

如果它能够正常工作,那就是依靠解析当前工作目录,Python 2.x中的隐式相对导入或手动修改的PYTHONPATH / sys.path

这是PEP8所说的导入类型:

  

永远不要使用隐式相对导入,并且在Python 3中已将其删除。

那该怎么办呢? sys.path应该增加顶级目录,而不是内部软件包目录,即:

PYTHONPATH=/path1/dir1:/path2

并这样更改导入:

from dir2.utils.pkg2.mod2 import func2

现在子软件包 dir2.utils来自顶级软件包utils的{​​{3}}。