当我跑步时
bazel test :all -- --test_output=all
我得到:
ImportError:尝试在没有已知父包的情况下进行相对导入
我尝试过像这样进行相对导入:
from .pose import Pose
然后我尝试使用绝对导入,使用包含
__init__.py
文件的目录名称:
from pose_format.pose import Pose
但后来我得到:
ModuleNotFoundError:没有名为“pose_format”的模块
使用 pytest(PyCharm 内置)运行第二个配置有效,而第一个配置则无效。
有没有办法让bezel知道相关的模块结构是什么?
我想我找到了解决方案:我有一个像这样的目录结构:
\- src
\- foo_module
|- BUILD
|- main.py
\- baz.py
问题显然是:
main
源文件放置在构建输出文件的根目录下,无论其源目录如何。这意味着,如果在
main.py
中我想导入 baz
,则无论使用相对导入还是导入 foo_module
都不会起作用,就像您的情况一样。
一个解决方案是
import src.foo_module.baz
但这很丑而且不太便携。
对我来说更好的方法是向 BUILD 文件添加一个附加参数:
3 py_binary(
4 name = "main",
5 srcs = ["main.py"],
6 main = "main.py",
7 imports = [".."], # <-------
8 deps = [
9 ":baz",
11 ],
13 )
imports = [".."]
参数指向src
目录,它允许从我想要的路径导入模块:
import foo_module.baz