sna*_*che 8 siblings python-import importerror python-3.x
我有以下文件结构:
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
Run Code Online (Sandbox Code Playgroud)
bot.py当从命令行执行时,将加载plugins目录中的所有内容。
我想从目录plugins/parsemessages.py导入,所以我这样做:parsehelpers
# parsemessages.py
from ..helpers import parse
parse.execute("string to be parsed")
Run Code Online (Sandbox Code Playgroud)
我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
Run Code Online (Sandbox Code Playgroud)
所以我把两个点改为一个:
# parsemessages.py
from .helpers import parse
parse.execute("string to be parsed")
Run Code Online (Sandbox Code Playgroud)
...但我收到另一个错误:
File "/home/bot/plugins/parsemessages.py", line 2, in <module>
from .helpers import parse
ImportError: No module named 'plugins.helpers'
Run Code Online (Sandbox Code Playgroud)
我怎样才能让这个导入工作?
值得注意的是,我并不是试图在这里制作一个包,这只是一个普通的脚本。话虽这么说,我不愿意乱搞sys.path- 我希望它使用起来干净。
此外,我想parse导入为parse- 因此对于上面的示例,我应该输入parse.execute()而不是execute().
我找到了这篇文章和这篇文章,但它们从文件结构中相当深的文件开始(我的文件位于顶部)。我也找到了这篇文章,但它似乎在谈论一个包而不仅仅是一个常规的 .py。
这里有什么解决办法呢?
你可以删除这些点,它应该可以工作:
# parsemessages.py
from helpers import parse
parse.execute("string to be parsed")
Run Code Online (Sandbox Code Playgroud)
如果您真的不想将其打包,这可能是您最好的解决方案。您还可以将整个项目嵌套在更深的一个目录中,并像python3 foo/bot.py.
解释:
当您不使用实际安装的包而只是导入与当前工作目录相关的内容时,该目录中的所有内容都被视为顶级包。在您的情况下,bot、plugins、helpers和commands都是顶级包/模块。您当前的工作目录本身不是一个包。
所以当你做...
from ..helpers import parse
Run Code Online (Sandbox Code Playgroud)
...helpers被认为是顶级包,因为它位于您当前的工作目录中,并且您尝试从比该目录高的一级导入(从当前工作目录本身,这不是一个包)。
当你做...
from .helpers import parse
Run Code Online (Sandbox Code Playgroud)
...您正在相对于 导入plugins。于是.helpers决定plugins.helpers。
当你做...
from helpers import parse
Run Code Online (Sandbox Code Playgroud)
...它被发现helpers是一个顶级包,因为它位于您当前的工作目录中。
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |