如何从python3中的同级目录导入?

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。

这里有什么解决办法呢?

jnr*_*bsn 5

你可以删除这些点,它应该可以工作:

# parsemessages.py
from helpers import parse
parse.execute("string to be parsed")
Run Code Online (Sandbox Code Playgroud)

如果您真的不想将其打包,这可能是您最好的解决方案。您还可以将整个项目嵌套在更深的一个目录中,并像python3 foo/bot.py.

解释:

当您不使用实际安装的包而只是导入与当前工作目录相关的内容时,该目录中的所有内容都被视为顶级包。在您的情况下,botpluginshelperscommands都是顶级包/模块。您当前的工作目录本身不是一个

所以当你做...

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是一个顶级包,因为它位于您当前的工作目录中。