[英]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_library
或import app.bar.bar_library
。
相反,我必须import bar.bar_library.py
- 即如果我从main.py
而不是foo/foo_library.py
导入它的路径。
有没有办法使用import app.bar.bar_library
或from..bar import bar_library
?
相对导入仅适用于单个 package。 在您的示例中,您有一个带有子包foo
和bar
的 package app
。 只要脚本或模块导入app
(例如import app
),那么foo
和bar
中的模块就可以进行相对导入。
脚本不在包中。 这与通常用于可执行文件的 model 相同,其中操作系统的任务是在公共 LIB 目录中查找 static 动态库。 所以main.py
没有app
package 的固有知识。
当 python 运行脚本时,它会将其路径添加到sys.path
以便可以导入该路径中的任何模块或目录。 在您的情况下, main.py
可以import foo
和import bar
。 但是如果你这样做, foo
和bar
是单独的包,并且相对导入将在它们之间不起作用。
您可以通过将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.