使用具有相同顶级模块的多个包将包安装为可编辑会中断导入

Installing package as editable with multiple packages with same top-level module breaks import

我的目录结构如下:

.
├── client
│   └── main.py
├── lib1
│   ├── setup.py
│   └── top
│       ├── __init__.py
│       └── lib1
│           └── __init__.py
└── lib2
    ├── setup.py
    └── top
        ├── __init__.py
        └── lib2
            └── __init__.py

lib1lib2 是两个不同的包,它们都在 top 模块中提供子模块。

client 目录包含一个使用 lib1lib2 的 python 项目。 main.py的内容是:

import top.lib1
import top.lib2

在虚拟环境中通过路径安装这两个库时一切正常:

$ python -mvenv /tmp/venv1
$ source /tmp/venv1/bin/activate
$ pip install ./lib1 ./lib2
$ python client/main.py

但是,如果我将其中一个库安装为可编辑,其中一个导入将停止工作:

$ python -mvenv /tmp/venv2
$ source /tmp/venv2/bin/activate
$ pip install ./lib1 -e ./lib2
$ python client/main.py
Traceback (most recent call last):
  File "/.../client/main.py", line 1, in <module>
    import top.lib1
ModuleNotFoundError: No module named 'top.lib1'

有解决办法吗?


我正在使用 Python 3.9.6,setup.py 的内容 lib1 是(与 lib2 类似):

from setuptools import setup

setup(
    name="lib1",
    author="example",
    author_email="example@example.com",
    packages=[
        "top.lib1",
    ],
    version="0.0.1",
)

如果我删除了两个 top/__init__.py 文件,那么它对我有用。

$ rm */top/__init__.py
$ cat > client/main.py <<EOF
import top.lib1
import top.lib2
print(top)
print(top.lib1)
print(top.lib2)
EOF
$ repro2/venv2/bin/python client/main.py 
<module 'top' (namespace)>
<module 'top.lib1' from '.../so68922155/repro2/venv2/lib/python3.9/site-packages/top/lib1/__init__.py'>
<module 'top.lib2' from '.../so68922155/lib2/top/lib2/__init__.py'>

我把你问题的代码放到了 GitHub repository.