如何从同一目录中的模块导入?
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
.
我正在尝试创建一个 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
.