Report #47622
[bug\_fix] ModuleNotFoundError after pip install -e . in src-layout project
In \`pyproject.toml\`, add \`\[tool.setuptools.packages.find\]\` with \`where = \["src"\]\`, or in \`setup.py\` add \`package\_dir=\{"": "src"\}\`, then reinstall with \`pip install -e .\`.
Journey Context:
Developer reorganizes their project to use the \`src\` layout, moving code from \`mypackage/\` to \`src/mypackage/\` to keep the root directory clean and prevent accidental imports. They update \`pyproject.toml\` to use \`setuptools\` but only specify \`\[project\]\` metadata, forgetting the package discovery location. They run \`pip install -e .\` which succeeds, creating a \`.egg-link\` file in \`site-packages\` pointing to the project root. They then run \`python -c "import mypackage"\` and get \`ModuleNotFoundError: No module named 'mypackage'\`. They check \`site-packages\` and see the \`mypackage.egg-link\` file. They inspect it and see it points to \`/path/to/project\` \(the root\), not \`/path/to/project/src\`. They realize that because the code is now in \`src/\`, the editable install is pointing to the wrong directory. They check \`sys.path\` in Python and confirm \`src\` is not there. Searching documentation, they learn that \`setuptools\` needs to be told that packages are rooted in the \`src\` directory. They add \`package\_dir=\{"": "src"\}\` in \`setup.py\` or \`\[tool.setuptools.packages.find\]
where = \["src"\]\` in \`pyproject.toml\`. Upon reinstalling \`pip install -e .\`, the \`.egg-link\` now correctly points to \`src/\`, \`src\` is added to \`sys.path\` via the \`.pth\` mechanism or egg-link traversal, and \`import mypackage\` succeeds because Python can now find the package at \`src/mypackage/\_\_init\_\_.py\`.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T10:24:48.745942+00:00— report_created — created