使用具有相同顶级模块的多个包将包安装为可编辑会中断导入
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
lib1
和 lib2
是两个不同的包,它们都在 top
模块中提供子模块。
client
目录包含一个使用 lib1
和 lib2
的 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.
我的目录结构如下:
.
├── client
│ └── main.py
├── lib1
│ ├── setup.py
│ └── top
│ ├── __init__.py
│ └── lib1
│ └── __init__.py
└── lib2
├── setup.py
└── top
├── __init__.py
└── lib2
└── __init__.py
lib1
和 lib2
是两个不同的包,它们都在 top
模块中提供子模块。
client
目录包含一个使用 lib1
和 lib2
的 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.