我正在使用Poetry构建一些名称空间包。每个软件包的目录结构都相同:
package_bbb
pyproject.toml
aaa
bbb
myservice.py
__init__.py
__init__.py
使用诗歌,我可以制造一个轮子,安装并使用包装:
from aaa.bbb import myservice
当我开始构建第二个程序包时,我的问题就发生了,它需要第一个程序包作为依赖项。
结构保持不变:
package_ccc
pyproject.toml
aaa
ccc
mydata.py
__init__.py
__init__.py
在诗歌中,我将第一个添加为依赖项:
poetry add package_bbb
该软件包将安装(来自内部存储库)在生成的virtualenv中,并添加到pyproject.toml中。
第二包的车轮也很完美。第一个软件包将通过pip作为依赖项安装。
问题出在开发过程中:例如,如果我尝试在 mydata.py 内部,从第一个程序包中导入某些内容:
from aaa.bbb import myservice
我找不到模块。我认为这是因为我有2个aaa命名空间:一个在virtualenv中,一个在项目根目录中。第二个优先,并且没有aaa.bbb。
我是否在包的结构中缺少某些内容,或者有一种方法可以避免这种“命名空间冲突”?
非常感谢您的帮助!
答案 0 :(得分:0)
您需要从两个软件包的__init__.py
文件夹中删除aaa
。否则,aaa
将被检测为普通软件包,而不是名称空间软件包。有关更多详细信息,请参见https://www.python.org/dev/peps/pep-0420/#specification。