为什么 pip editable install 会导致子包出现问题?

Why is pip editable install causing issue with subpackages?

问题

我在为我的包使用可编辑安装时遇到问题。在我的包中,我有三个子包,如我的 setup.py 文件所示。如果我使用 pip install . 安装,一切正常,但是如果我使用 pip install -e . 安装,那么在尝试 运行 CLI relctl:[=18 时,我会收到以下错误=]

Traceback (most recent call last):
  File "/Users/my_username/.virtualenvs/rawp3/bin/relctl", line 11, in <module>
    load_entry_point('tech-control', 'console_scripts', 'relctl')()
  File "/Users/my_username/.virtualenvs/rawp3/lib/python3.7/site-packages/pkg_resources/__init__.py", line 490, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/Users/my_username/.virtualenvs/rawp3/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2859, in load_entry_point
    return ep.load()
  File "/Users/my_username/.virtualenvs/rawp3/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2450, in load
    return self.resolve()
  File "/Users/my_username/.virtualenvs/rawp3/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2456, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'tech_control.cli'

经过进一步检查,我发现我无法导入任何子包。例如。以下将失败: import tech_control.boards 失败:ModuleNotFoundError: No module named 'tech_control.boards'

我的包裹目录

tech_control/
├── __init__.py
├── boards
│   ├── __init__.py
│   ├── board_base.py
│   ├── tech8ch.py
│   └── wiring.py
├── cli
│   ├── __init__.py
│   └── cli.py
└── setup.py

Setup.py

from setuptools import setup

setup(
    name="tech_control",
    version="0.1.0",
    description="CLI for Tech Boards",
    packages=["tech_control", "tech_control.boards", "tech_control.cli"],
    package_dir={
        "tech_control": "",
        "tech_control.boards": "boards",
        "tech_control.cli": "cli"},
    install_requires=["pyusb"],
    entry_points={
        "console_scripts": [
            "relctl = tech_control.cli.cli:main"
        ]
    },
)

问题

为什么我的可编辑安装阻止我访问子包?

据我所知,editable 安装不能像 package_dir.

那样更改目录结构

更改根目录是可以的,但是:

package_dir={'': 'path/to/root'}

参考资料:

旁白:

目前正在努力为 可编辑 装置进行新设计。很可能与重写目录结构的组合可能不在范围内,因为它可能不是经常出现的用例,以至于值得额外的代码复杂性来支持它。