代码之家  ›  专栏  ›  技术社区  ›  snazzybouche

如何从python3中的兄弟目录导入?

  •  2
  • snazzybouche  · 技术社区  · 7 年前

    我有以下文件结构:

    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 导入 parse helpers

    # 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.execute() execute() .

    我发现 this post this post ,但它们是从一个文件开始的,该文件在文件结构中很深(我的文件就在顶部)。我还发现 this post ,但它似乎是在谈论一个包,而不仅仅是一个普通的.py。

    这里有什么解决办法?

    0 回复  |  直到 7 年前
        1
  •  1
  •   jnrbsn    7 年前

    你可以去掉这些点,它应该能起作用:

    # parsemessages.py
    from helpers import parse
    parse.execute("string to be parsed")
    

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

    说明:

    当您不使用实际安装的包,而只导入与当前工作目录相关的内容时,该目录中的所有内容都被视为顶级包。对你来说, bot plugins , helpers ,和 commands 都是顶级包/模块。您当前的工作目录 .

    所以当你这样做的时候。。。

    from ..helpers import parse
    

    ... 帮手 被认为是顶级包,因为它位于当前工作目录中,并且您正试图从高于该目录的一个级别导入( 您当前的工作目录 ,这不是一个包)。

    当你这样做的时候。。。

    from .helpers import parse
    

    插件 . 所以 .helpers 决心 plugins.helpers .

    当你这样做的时候。。。

    from helpers import parse
    

    ... 它发现 帮手