使用 Drake 作为外部 Bazel 时 PYTHONPATH 中的意外路径
Unexpected path in PYTHONPATH when using Drake as a Bazel external
我在另一个 bazel 项目中使用 drake 作为外部,它正在向 PYTHONPATH
添加 ...runfiles/drake
和 ...runfiles/drake/bindings
。后者几乎只包含 pydrake
(这正是我想要的),但前者包括一堆其他目录作为模块,包括 common 、示例、工具和绑定,这导致与我自己的项目发生名称冲突。这是预期的行为吗?处理这个问题的最佳方法是什么?我测试了 drake-external-examples/drake_bazel_external 中的示例,我看到了同样的问题(相关提交 here)。
TL;DR 处理此问题的最佳方法是确保您的导入在您的项目范围内;例如而不是 from common import foo
,而是 from drake_bazel_external.common import foo
.
这是一个示例 Bazel 项目的片段,它使用 Python:
对于根本原因,这是我尝试用更多输出来检测您的重现,固定到 drake@v0.18.0
:
drake_bazel_external/apps/bar.py
(branch)
这是 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
问题:
- https://github.com/RobotLocomotion/drake/issues/7871
- https://github.com/bazelbuild/bazel/issues/7653
最好的方法是使用特定于项目的导入。现在,尝试通过使用更具体的导入来避免这种情况。
我将重新打开 Drake 问题,但由于有更好的解决方案 (IMO),我会将其保持在低优先级,并且需要更多的基础设施工作才能实现。
谢谢!
编辑:具体来说,最严重地绊倒你的例子的是 Bazel 正在生成 @drake//common:__init__.py
。它的生成只是因为 legacy_create_init
标志,以及我们想要文件 libdrake_marker.so
.
的事实
drake
(以及其他存储库)仍然在 Python 上。
编辑 2:根据 Jeremy 的要求提交了一个新问题:https://github.com/RobotLocomotion/drake/issues/13320
我在另一个 bazel 项目中使用 drake 作为外部,它正在向 PYTHONPATH
添加 ...runfiles/drake
和 ...runfiles/drake/bindings
。后者几乎只包含 pydrake
(这正是我想要的),但前者包括一堆其他目录作为模块,包括 common 、示例、工具和绑定,这导致与我自己的项目发生名称冲突。这是预期的行为吗?处理这个问题的最佳方法是什么?我测试了 drake-external-examples/drake_bazel_external 中的示例,我看到了同样的问题(相关提交 here)。
TL;DR 处理此问题的最佳方法是确保您的导入在您的项目范围内;例如而不是 from common import foo
,而是 from drake_bazel_external.common import foo
.
这是一个示例 Bazel 项目的片段,它使用 Python:
对于根本原因,这是我尝试用更多输出来检测您的重现,固定到 drake@v0.18.0
:
drake_bazel_external/apps/bar.py
(branch)
这是 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
问题:
- https://github.com/RobotLocomotion/drake/issues/7871
- https://github.com/bazelbuild/bazel/issues/7653
最好的方法是使用特定于项目的导入。现在,尝试通过使用更具体的导入来避免这种情况。
我将重新打开 Drake 问题,但由于有更好的解决方案 (IMO),我会将其保持在低优先级,并且需要更多的基础设施工作才能实现。
谢谢!
编辑:具体来说,最严重地绊倒你的例子的是 Bazel 正在生成 @drake//common:__init__.py
。它的生成只是因为 legacy_create_init
标志,以及我们想要文件 libdrake_marker.so
.
drake
(以及其他存储库)仍然在 Python 上。
编辑 2:根据 Jeremy 的要求提交了一个新问题:https://github.com/RobotLocomotion/drake/issues/13320