我有一个包含多个文件的模块,其结构如下:
/bettermod/
├── __init__.py
├── api.py
├── bettermod.py
├── errors.py
└── loggers.py
从
bettermod.py
,我正在尝试导入两件事:
API
的课程,来自 api.py
errors.py
文件首先,这很简单,我只需要这样做:
from .api import API
但是,对于导入整个
errors.py
文件,我遇到了问题;我正在尝试这样做:
from . import errors
根据这个python文档,这应该可以工作,但它会引发以下错误:
File "/path/to/bettermod/bettermod.py", line 10, in <module>
from . import errors
ModuleNotFoundError: No module named 'bettermod'
编辑:调试时,我发现
__name__
等于bettermod.bettermod
来自文档:
请注意,相对导入基于当前模块的名称。
我无法确定地告诉你出了什么问题,但有一种味道:
bettermod
包有一个bettermod
模块。你想做from bettermod.bettermod import MyBetterClass
吗?我对此表示怀疑。在 Python 文件中,文件是命名空间,因此选择文件和目录名称也是一种 API 设计。请记住这一点。
我怀疑问题被名称冲突掩盖了。尝试这个。如果您在
python
目录中运行 bettermod
并说 import bettermod
您正在导入 bettermod\bettermod.py
。而.
是相对于bettermod.py
模块而言的。现在尝试在 python
包目录上方的目录中运行 bettermod
。它会起作用,因为现在 .
解析为 bettermod
包。
尝试:
import mymodule
mymodule.__file__
这将告诉您
mymodule
是什么。对于软件包,它将显示 __init__.py
的路径。这将帮助您确定自己的方向。另请参阅 PYHTONPATH
以及如何使用它来确保从正确的路径导入。
这是如何修复的好教程https://fortierq.github.io/python-import/
下一个文件结构
project
└── src
├── db
│ └── models.py
└── scripts
└── script.py
对我来说,下一个施工工作是在
script.py
import sys
from pathlib import Path
path_root = Path(__file__).parents[1]
print(path_root)
sys.path.append(str(path_root))
from db.models import Station