繁体   English   中英

被迫在 python 中导入相对于 main.py 的文件

[英]Being forced to import files relative to main.py in python

我已经阅读了几个关于此的链接,但无法找到可以解决我的情况的内容。

这是我的目录结构:

- app

  - __init.py
  - main.py

  - foo
    - __init.py
    - foo_library.py

  - bar
    - __init.py
    -  bar_library.py

我的应用程序从main.py开始,然后导入/调用所有其他文件。

但是,似乎我必须导入与main.py相关的所有文件。

例如在foo/foo_library内部,如果我想导入bar/bar_library ,那么我不能from..bar import bar_libraryimport app.bar.bar_library

相反,我必须import bar.bar_library.py - 即如果我从main.py而不是foo/foo_library.py导入它的路径。

有没有办法使用import app.bar.bar_libraryfrom..bar import bar_library

相对导入仅适用于单个 package。 在您的示例中,您有一个带有子包foobar的 package app 只要脚本或模块导入app (例如import app ),那么foobar中的模块就可以进行相对导入。

脚本不在包中。 这与通常用于可执行文件的 model 相同,其中操作系统的任务是在公共 LIB 目录中查找 static 动态库。 所以main.py没有app package 的固有知识。

当 python 运行脚本时,它会将其路径添加到sys.path以便可以导入该路径中的任何模块或目录。 在您的情况下, main.py可以import fooimport bar 但是如果你这样做, foobar是单独的包,并且相对导入将在它们之间不起作用。

您可以通过将main.py上移一个目录来解决问题,以便它可以导入app 更一般地说,您可以将main.py移动到源代码树中的脚本目录中,并将 package + 脚本包装到可安装的发行版中。

使 package 可安装时,另一个流行的选择是将入口点声明添加到setup.py 安装程序将在操作系统路径中添加一些小的虚拟文件,这些文件本质上是执行python3 -m app.main以在 package 中运行模块。 这样一来,main.py 就是 package 的一部分,并且可以进行相关导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM