我是 python 编程新手,正在尝试学习命名空间包。
我在两个目录path1和path2中有命名空间包split_farm
,如下所示-
$ tree .
.
├── path1
│ └── split_farm
│ ├── common.py
│ ├── cow.py
│ ├── __init__.py
│ ├── ox.py
│ └── __pycache__
│ └── __init__.cpython-35.pyc
└── path2
└── split_farm
├── chicken.py
├── __init__.py
├── __pycache__
│ └── __init__.cpython-35.pyc
└── turkey.py
6 directories, 9 files
然后我将 path1 和 path2 扩展为 sys.path,如下所示 -
$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.extend(['path1', 'path2'])
>>> import split_farm
>>> split_farm.__path__
['path1/split_farm']
>>> locals()
{'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, 'split_farm': <module 'split_farm' from 'path1/split_farm/__init__.py'>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None}
如上所示,仅导入了“path1/split_farm”,但未导入“path2/split_farm”。
我的代码在 github 上 here 。
我该如何解决这个问题?
最佳答案
我认为没有一种简单的方法可以完成您正在做的事情。
基本上,Python 通过在 PYTHONPATH 环境变量中包含的每个目录中按顺序查找模块来导入模块。一旦找到匹配项,它就会停在那里。
在本例中,它在 path1
中找到 split_farm
,导入它,然后停在那里。它将把 path2
中的 split_farm
视为完全不同的模块,这将被视为命名空间冲突。
使用一大堆自定义导入逻辑并使用加载的模块可以实现这一点,但我不推荐这样做。
更惯用的方法是让两个包在父包中命名不同的东西,或者将它们组合成一个包。
关于python3 只有一个目录被导入到命名空间包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56829700/