我试着通读关于兄弟姐妹导入的问题,甚至
软件包文档,但我还没找到答案。
结构如下:
├── LICENSE.md
├── README.md
├── api
│ ├── __init__.py
│ ├── api.py
│ └── api_key.py
├── examples
│ ├── __init__.py
│ ├── example_one.py
│ └── example_two.py
└── tests
│ ├── __init__.py
│ └── test_one.py
示例和测试目录中的脚本如何从
API模块和从命令行运行?
另外,我希望避免对每个文件都使用难看的sys.path.insert。肯定
这可以在Python中完成,对吧?
对于2021年的读者:如果你对pip没有信心,请安装-e:
考虑一下这个层次结构,正如Python 3中相对导入的答案所推荐的那样:
MyProject
├── src
│ ├── bot
│ │ ├── __init__.py
│ │ ├── main.py
│ │ └── sib1.py
│ └── mod
│ ├── __init__.py
│ └── module1.py
└── main.py
main.py的内容,这是起点,我们在这里使用绝对导入(没有前导点):
from src.bot import main
if __name__ == '__main__':
main.magic_tricks()
bot/main.py的内容,它利用了显式的相对导入:
from .sib1 import my_drink # Both are explicit-relative-imports.
from ..mod.module1 import relative_magic
def magic_tricks():
# Using sub-magic
relative_magic(in=["newbie", "pain"], advice="cheer_up")
my_drink()
# Do your work
...
原因如下:
当执行python MyProject/main.py时,/到/MyProject的路径被添加到sys.path中。
绝对导入import src。机器人会读的。
从…mod部分意味着它将上升一级到MyProject/src。
我们能看看吗?是的,因为路径/to/MyProject被添加到sys.path中。
所以重点是:
我们应该把主脚本放在MyProject/src旁边,因为当做相对引用时,我们不会离开src,绝对导入导入src。为我们提供合适的作用域:src/ scope。
参见:ModuleNotFoundError:没有名为“sib1”的模块