我将简化表示法。我有
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和其他地方的现有问题;我找到的所有答案都取决于我没有的某些软件包“句柄”。
答案 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}}。