[Python] pip Install Editable Package Produces ModuleNotFoundError

Discussão em 'Python' iniciado por Stack, Março 28, 2025.

  1. Stack

    Stack Membro Participativo

    Due to import issues, I've followed the steps shown here to install my Python project as an editable pip package. Basically this entails running pip install -e . from my project root directory. The name of the project is 'myproject', with the setup.py configured as such:

    from setuptools import setup, find_packages

    setup(name='myproject', version='1.0', packages=find_packages())


    The project structure is like so:

    .
    ├── myproject
    │ ├── core
    │ │ ├── core.py
    │ │ └── __init__.py
    │ └── tests
    │ ├── __init__.py
    │ └── test_one.py
    ├── setup.py
    └── env
    └── ...


    With the venv activated, I get the following output:

    (env) [root@localhost /]$ python -V
    Python 3.6.3

    (env) [root@localhost /]$ pip -V
    pip 9.0.1 from /myproject/venv/lib64/python3.6/site-packages (python 3.6)


    However, when running an interpreted session I experience the following:

    (env) [root@localhost /]$ python
    >>> import myproject
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'myproject'
    >>> from myproject.core import *
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'myproject'


    Starting up another interpreted session and running the setuptools stuff myself results in:

    (env) [root@localhost /]$ python
    >>> from setuptools import find_packages
    >>> find_packages()
    >>> ['core', 'tests']


    I've also tried other methods of installing it, including:

    python -m pip install -e .


    And still get the same problems. Finally, I can do the following:

    (env) [root@localhost /] pip list installed | grep myproject
    myproject (1.0, /myproject)


    UPDATE: As shown here and as mentioned by @Fletchy1995 below, changing the directory structure so that it is instead like:

    .
    ├── setup.py
    ├── myproject
    │ ├── core
    │ │ ├── core.py
    │ │ └── __init__.py
    │ └── tests
    │ ├── __init__.py
    │ └── test_one.py
    ├── __init__.py
    └── env
    └── ...


    And modifying setup.py to look like:

    from setuptools import setup

    setup(name='myproject', version='1.0', packages=['myproject'])


    along with running pip install -e . from the top level directory seems to have fixed the problem. But in the previous case, even though the packages loaded include all sub-packages of 'myproject', why can I still not do something like:

    (env) [root@localhost /]$ python
    >>> from myproject.core import *


    as 'myproject' is listed in pip?

    Continue reading...

Compartilhe esta Página