我会缩短符号。我有
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
问题在于我现在正在调整此代码以调用从 dir1
中的 utils
导入的函数;我无法改变这部分环境。
如何使我的代码适用于 dir2/utils
模块?不幸的是,这还需要适应Python 2.6.6及更高版本。
我搜索了有关 SO 和其他地方的现有问题;我找到的所有答案都取决于我没有的某个包“句柄”。
最佳答案
此导入语句不正确:
from utils.pkg2.mod2 import func2
如果它曾经正常工作过,那就依赖于当前工作目录的解析、Python 2.x 中的隐式相对导入或手动修改的 PYTHONPATH
/sys.path
.
这是 PEP8 所说的导入类型:
Implicit relative imports should never be used and have been removed in Python 3.
那么该怎么办呢? sys.path
应使用顶级目录进行扩充,而不是包内目录,即:
PYTHONPATH=/path1/dir1:/path2
并像这样更改导入:
from dir2.utils.pkg2.mod2 import func2
现在子包dir2.utils
是namespaced来自顶级包utils
。
关于python - 在 PYTHONPATH 元素顶部导入两个同名的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58718851/