python - 被迫在python中导入相对于main.py的文件
问题描述
我已经阅读了几个关于此的链接,但无法找到可以解决我的情况的内容。
这是我的目录结构:
- 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
吗?
解决方案
相对导入仅适用于单个包。在您的示例中,您有一个app
带有子包foo
和bar
. 只要一个脚本或模块导入app
(例如,import app
),那么模块在foo
并且bar
可以做相对导入。
脚本不在包中。这与通常用于可执行文件的模型相同,其中操作系统的任务是在公共 LIB 目录中查找静态动态库。所以main.py
对app
包没有固有的知识。
当 python 运行脚本时,它会添加其路径,sys.path
以便可以导入该路径中的任何模块或目录。在你的情况下,main.py
可以import foo
和import bar
。但是如果你这样做,foo
并且bar
是单独的包和相对导入将在它们之间不起作用。
您可以通过上移一个目录来解决问题,main.py
以便它可以导入app
. 更一般地,您可以移动main.py
到源代码树中的脚本目录并将您的包 + 脚本包装到可安装的发行版中。
使软件包可安装时,另一个流行的选择是将入口点声明添加到setup.py
. 安装程序将在操作系统路径中添加小的虚拟文件,这些文件本质上是python3 -m app.main
为了在包中运行模块。通过这种方式,main.py 是包的一部分,可以进行相对导入。
推荐阅读
- activemq-artemis - 添加接受器并在不重启代理的情况下运行它
- clang-static-analyzer - 在 Clang 静态分析器的上下文中,“ento”是什么意思?
- python-3.x - 使用 python 数学模块生成锯齿波
- reactjs - 从 utf-8 编码的 rest api 调用响应中提取压缩图像,并将这些图像显示给用户做出反应,无需下载
- c++ - 为什么 std::filesystem::path("//.") 与 std::filesystem::path("//") / std::filesystem::path(".") 不同?
- c++ - 数组到图像的替代品
- r - 无法安装 nloptr (R 4.0.3, Ubuntu 20.04)
- tinymce - Tinymce 5 对话框 urlinput 禁用/启用损坏
- terraform - 模块内部无法识别配置的提供程序
- amazon-s3 - 将批量 csv 数据上传到现有 DynamoDB 表中