为什么 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'}
参考资料:
- https://github.com/pypa/pip/issues/3160
- https://github.com/pypa/setuptools/issues/463
- https://github.com/pypa/setuptools/issues/230
- https://docs.python.org/3/distutils/setupscript.html?highlight=package_dir#listing-whole-packages
- https://docs.python.org/3/distutils/examples.html?highlight=package_dir#pure-python-distribution-by-package
- https://setuptools.readthedocs.io/en/latest/setuptools.html?highlight=package_dir#using-find-packages
- https://setuptools.readthedocs.io/en/latest/setuptools.html?highlight=package_dir#using-a-src-layout
旁白:
目前正在努力为 可编辑 装置进行新设计。很可能与重写目录结构的组合可能不在范围内,因为它可能不是经常出现的用例,以至于值得额外的代码复杂性来支持它。
问题
我在为我的包使用可编辑安装时遇到问题。在我的包中,我有三个子包,如我的 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'}
参考资料:
- https://github.com/pypa/pip/issues/3160
- https://github.com/pypa/setuptools/issues/463
- https://github.com/pypa/setuptools/issues/230
- https://docs.python.org/3/distutils/setupscript.html?highlight=package_dir#listing-whole-packages
- https://docs.python.org/3/distutils/examples.html?highlight=package_dir#pure-python-distribution-by-package
- https://setuptools.readthedocs.io/en/latest/setuptools.html?highlight=package_dir#using-find-packages
- https://setuptools.readthedocs.io/en/latest/setuptools.html?highlight=package_dir#using-a-src-layout
旁白:
目前正在努力为 可编辑 装置进行新设计。很可能与重写目录结构的组合可能不在范围内,因为它可能不是经常出现的用例,以至于值得额外的代码复杂性来支持它。