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

How to import from a module in the same directory?

我正在尝试创建一个 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

这个returns下面的回溯 (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.py.

中找到 project.cache.default

实际代码中没有前导点的 cache.default 是绝对路径,来自 sys.path 中的任何目录。由于在任何这些目录中都没有名为 cache 的文件或目录,因此失败。


同时,您的项目目录结构似乎也与您向我们展示的不一样。否则,import project 应该找不到安装的版本。默认情况下(我认为您没有做任何改变它的事情),sys.path "is the directory containing the script that was used to invoke the Python interpreter" 中的第一个条目。其中,鉴于您在此处发布的结构,意味着 import project 应该在与 test.py 相同的目录中找到 project 子目录,而不是在您的 venv 的 site-packages.