首页 > 解决方案 > 将 Drake 用作 Bazel 外部时,PYTHONPATH 中出现意外路径

问题描述

我在另一个 bazel 项目中使用 drake 作为外部,它正在添加...runfiles/drake以及. 后者几乎只包含(这是我想要的),但前者包含一堆其他目录作为模块,包括 common、examples、tools 和 bindings,这会导致与我自己的项目的名称冲突。这是预期的行为吗?处理这个问题的最佳方法是什么?我测试了 drake-external-examples/drake_bazel_external 中的示例,我看到了同样的问题(相关提交在这里)。...runfiles/drake/bindingsPYTHONPATHpydrake

标签: pythonbazeldrake

解决方案


TL;DR 处理此问题的最佳方法是确保您的导入范围仅限于您的项目;例如,而不是from common import foo,而不是做from drake_bazel_external.common import foo

这是使用 Python 执行此操作的示例 Bazel 项目的片段:

https://github.com/EricCousineau-TRI/repro/blob/39f79009a2e89b987f072276d1921a282f63e6a1/python/bazel_py_example/mid/py3_bin.py#L3


根本原因,这是我尝试使用更多输出来检测您的重现,固定到drake@v0.18.0

drake_bazel_external/apps/bar.py分支

这是 Python 路径的预览,它证实了您所看到的内容:

path:
  {source_tree}/apps
  {runfiles}
  {runfiles}/drake/bindings
  {runfiles}/lcmtypes_bot2_core/lcmtypes
  {runfiles}/lcmtypes_bot2_core
  {runfiles}/lcmtypes_robotlocomotion/lcmtypes
  {runfiles}/lcmtypes_robotlocomotion
  {runfiles}/meshcat_python/src
  {runfiles}/spdlog
  {runfiles}/meshcat_python
  {runfiles}/lcm
  {runfiles}/ignition_math
  {runfiles}/drake
  {runfiles}/drake_external_examples
  /usr/lib/python36.zip
  /usr/lib/python3.6
  /usr/lib/python3.6/lib-dynload
  /usr/lib/python3/dist-packages
common: {runfiles}/drake/common/__init__.py

最终,这是预期的行为。这是 Drake 问题和一个相关bazelbuild问题:

最好的方法是使用项目特定的导入。现在,尝试通过使用更具体的导入来避免这种情况。

我将重新打开 Drake 问题,但由于有更好的解决方案 (IMO),因此将其保持在低优先级,并且需要更多的基础设施工作才能实现。

谢谢!

编辑:具体来说,最严重地绊倒你的例子的是 Bazel 正在生成的事实@drake//common:__init__.py。它只是因为legacy_create_initflag 以及我们想要 file 的事实而生成的libdrake_marker.so

仍然存在drake(在其他存储库中)在 Python 上的事实。

编辑 2:根据 Jeremy 的要求提交了一个新问题:https ://github.com/RobotLocomotion/drake/issues/13320


推荐阅读