Bazel 测试 `ImportError` 相对导入

问题描述 投票:0回答:1

当我跑步时

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知道相关的模块结构是什么?

python bazel
1个回答
0
投票

我想我找到了解决方案:我有一个像这样的目录结构:

\- src
    \- foo_module
       |- BUILD
       |- main.py
       \- baz.py

问题显然是:

  • Bazel 默认将模块(项目)的根目录视为 Python 导入根目录。 (我不知道是否/如何改变这一点。)
  • 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
© www.soinside.com 2019 - 2024. All rights reserved.