-
Notifications
You must be signed in to change notification settings - Fork 75
Description
Editable installs can set __package__ to the wrong value for an extension submodule within a package.
Steps to reproduce:
git clone https://github.com/godlygeek/scikit-build-core-bug-reproducer
cd scikit-build-core-bug-reproducer
python3 -m venv venv
source venv/bin/activate
pip install .
python -c "import demo" # suceeds
pip install -e .
python -c "import demo" # fails
The demo package's __init__.py contains an assertion that the extension submodule has __package__ set correctly (to demo, the name of the package containing the extension module). When you do a regular pip install, it does, but when you do an editable pip install the assertion fails because __package__ has been incorrectly set to demo._demo instead of to demo.
The problem goes away if you edit the _demo_editable.py in the virtualenv and change:
if fullname in self.known_wheel_files:to
if fullname in self.known_wheel_files:
submodule_search_locations = Nonethough I assume that change would break other things. The problem is definitely caused by the submodule_search_locations being passed to importlib.util.spec_from_file_location though, and it seems to be triggered by the fact that the module's path demo._demo matches the name of a folder in the repo demo/_demo. Note that this is a common naming convention for extension modules though, including in CPython itself (e.g. Modules/_decimal/_decimal.c in CPython).
This was found in a real world codebase, in bloomberg/memray#673