如何从同一目录中的模块导入?

时间:2018-08-31 17:09:18

标签: python python-3.x python-import

我正在尝试制作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'

1 个答案:

答案 0 :(得分:2)

从您的追溯:

  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中的那个子目录。