我正在尝试制作一个Python3.6软件包,但是在从软件包中导入时遇到了ModuleNotFound错误。该包具有以下结构:
project/
project/
cache/
default.py
interface.py
__init__.py
handler.py
test.py
__init__.py
文件包含以下内容:
from .handler import Handler
def getHandler(access_token=None, **kwargs):
return Handler(access_token, **kwargs)
然后在handler.py
内,我试图从cache
导入以下内容:
from .cache.default import DefaultCache
目标是通过客户端代码允许以下内容:
import project
handler = project.getHandler()
最后一次导入是失败的,我不清楚为什么。有任何想法吗? TIA。
不确定它有多相关,但我通过在外部project
目录中运行以下代码来测试它:
> pip install .
> python3 ../test.py
这将返回以下回溯
(venv) Jamess-MacBook-Pro-2:project james$ python3 ../test.py
Traceback (most recent call last):
File "../test.py", line 1, in <module>
import project
File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/__init__.py", line 1, in <module>
from .handler import Handler
File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/handler.py", line 7, in <module>
from .cache.default import DefaultCache
ModuleNotFoundError: No module named 'project.cache'
从您的追溯:
File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/handler.py", line 7, in <module>
from cache.default import DefaultCache
这与你在这里展示的代码不一样:
from .cache.default import DefaultCache
.cache.default
是正确的 - 这是project
内部的相对路径,所以它会在project.cache.default
找到project/cache/default.py
。
在实际代码中没有前导点的cache.default
是sys.path
中任何目录的绝对路径。由于在任何这些目录中都没有名为cache
的文件或目录,因此失败。
同时,您的项目目录结构似乎与您向我们展示的内容不同。否则,import project
不应该找到已安装的版本。默认情况下(我认为你没有做任何改变),sys.path
中的第一个条目“是包含用于调用Python解释器的脚本的目录”。考虑到你在这里发布的结构,这意味着import project
应该在与project
相同的目录中找到test.py
子目录,而不是你的venv的site-packages
中的那个。