我有以下文件结构:
bot
├── LICENSE.md
├── README.md
├── bot.py # <-- file that is executed from command line
├── plugins
│ ├── __init__.py
│ ├── debug.py
│ └── parsemessages.py
├── helpers
│ ├── __init__.py
│ ├── parse.py
│ └── greetings.py
└── commands
├── __init__.py
└── search.py
bot.py
当从命令行执行时,将会加载plugins
目录中的所有内容。
我希望plugins/parsemessages.py
能够从helpers
目录导入parse
,因此我这样做:
# parsemessages.py
from ..helpers import parse
parse.execute("string to be parsed")
我在命令行中运行python3 bot.py
。
我得到以下错误:
File "/home/bot/plugins/parsemessages.py", line 2, in <module>
from ..helpers import parse
ValueError: attempted relative import beyond top-level package
所以我把两个点改成了一个:
# parsemessages.py
from .helpers import parse
parse.execute("string to be parsed")
...但我遇到了另一个错误:
File "/home/bot/plugins/parsemessages.py", line 2, in <module>
from .helpers import parse
ImportError: No module named 'plugins.helpers'
如何让这个导入工作?
值得注意的是,我不打算在这里制作一个包,这只是一个普通的脚本。话虽如此,我不想折腾sys.path
- 我希望这样使用很干净。
另外,我想要将parse
作为parse
导入 - 所以对于上面的示例,我应该输入parse.execute()
而不是execute()
。
我找到了这篇文章和这篇文章,但它们都从文件开始,而我的文件结构非常深(我的文件位于顶部)。我还发现了这篇文章,但它似乎在谈论一个包,而不仅仅是一个常规的.py文件。
这里的解决方案是什么?
from . import foo
? - hd1__init__.py
文件,它是否有效? - jnrbsnfrom . import parse
导致ImportError: 无法导入名称 'parse'
。 - snazzybouche