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

jti*_*ins 1 python python-import python-3.x

我正在尝试制作 Python3.6 包,但从包内导入时遇到了 ModuleNotFound 错误。该包具有以下结构:

project/
    project/
        cache/
            default.py
            interface.py
        __init__.py
        handler.py
test.py
Run Code Online (Sandbox Code Playgroud)

__init__.py文件包含以下内容:

from .handler import Handler

def getHandler(access_token=None, **kwargs):
    return Handler(access_token, **kwargs)
Run Code Online (Sandbox Code Playgroud)

然后在 中handler.py,我尝试使用cache以下内容导入:

from .cache.default import DefaultCache
Run Code Online (Sandbox Code Playgroud)

目标是允许客户端代码执行以下操作:

import project

handler = project.getHandler()
Run Code Online (Sandbox Code Playgroud)

最后的导入失败了,我不清楚为什么。有任何想法吗?TIA。

不确定它有多相关,但我正在通过在外部project目录中运行以下命令来测试它:

> pip install .
> python3 ../test.py
Run Code Online (Sandbox Code Playgroud)

这将返回以下回溯 (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'

aba*_*ert 5

从你的回溯来看:

\n\n
  File "/Users/james/Work/Project/project/venv/lib/python3.6/site-packages/project/handler.py", line 7, in <module>\n    from cache.default import DefaultCache\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与您在此处向我们展示的代码不同:

\n\n
from .cache.default import DefaultCache\n
Run Code Online (Sandbox Code Playgroud)\n\n

.cache.default是正确的\xe2\x80\x94,它是 中的相对路径project,因此它将project.cache.default在 中找到project/cache/default.py

\n\n

实际代码中不带前导点cache.default的是绝对路径,来自sys.path. cache由于这些目录中没有指定的文件或目录,因此它会失败。

\n\n
\n\n

同时,您的项目目录结构似乎也与您向我们展示的不同。否则,import project应该找不到已安装的版本。默认情况下(我认为您没有做任何更改),sys.path“是包含用于调用 Python 解释器的脚本的目录”中的第一个条目。考虑到您在此处发布的结构,这意味着应该在与 相同的目录中import project找到子目录,而不是您的 venv\'s 中的子目录。projecttest.pysite-packages

\n