pip 安装可编辑包产生 ModuleNotFoundError

Tho*_*ind 6 python pip package python-3.x python-venv

由于导入问题,我已按照此处显示的步骤将我的 Python 项目安装为可编辑pip包。基本上这需要pip install -e .从我的项目根目录运行。项目名称为“myproject”,setup.py配置如下:

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())
Run Code Online (Sandbox Code Playgroud)

项目结构是这样的:

.
??? myproject
?   ??? core
?   ?   ??? core.py
?   ?   ??? __init__.py
?   ??? tests
?       ??? __init__.py
?       ??? test_one.py
??? setup.py
??? env
    ??? ...
Run Code Online (Sandbox Code Playgroud)

随着venv启动,我得到下面的输出:

(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)
Run Code Online (Sandbox Code Playgroud)

但是,在运行解释会话时,我会遇到以下情况:

(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'
Run Code Online (Sandbox Code Playgroud)

启动另一个解释会话并setuptools自己运行这些东西会导致:

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

我还尝试了其他安装方法,包括:

python -m pip install -e .
Run Code Online (Sandbox Code Playgroud)

并且仍然遇到相同的问题。最后,我可以执行以下操作:

(env) [root@localhost /] pip list installed | grep myproject
myproject (1.0, /myproject)
Run Code Online (Sandbox Code Playgroud)

UPDATE:如图这里和由@ Fletchy1995下面如上所述,改变目录结构,使其像代替:

.
??? setup.py
??? myproject
?   ??? core
?   ?   ??? core.py
?   ?   ??? __init__.py
?   ??? tests
?       ??? __init__.py
?       ??? test_one.py
??? __init__.py
??? env
    ??? ...
Run Code Online (Sandbox Code Playgroud)

并修改setup.py为:

from setuptools import setup

setup(name='myproject', version='1.0', packages=['myproject'])
Run Code Online (Sandbox Code Playgroud)

随着pip install -e .从顶级目录运行似乎已经解决了这个问题。但是在前面的例子中,即使加载的包包括“myproject”的所有子包,为什么我仍然不能做这样的事情:

(env) [root@localhost /]$ python
>>> from myproject.core import *
Run Code Online (Sandbox Code Playgroud)

因为“myproject”列在pip

Set*_*h P -1

如果您修改为,它可能会setup.py起作用

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages(where='myproject'))
Run Code Online (Sandbox Code Playgroud)

然后,您可以pip install -e从根目录运行以可编辑模式安装包。