为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Drake 作为外部 Bazel 时 PYTHONPATH 中的意外路径

使用 Drake 作为外部 Bazel 时 PYTHONPATH 中的意外路径

慕尼黑8549860 2022-11-18 20:42:44
我在另一个 bazel 项目中使用 drake 作为外部,它正在添加...runfiles/drake以及添加...runfiles/drake/bindings到PYTHONPATH. 后者几乎只包括pydrake(这正是我想要的),但前者包括一堆其他目录作为模块,包括 common 、示例、工具和绑定,这导致与我自己的项目名称冲突。这是预期的行为吗?处理这个问题的最佳方法是什么?我测试了 drake-external-examples/drake_bazel_external 中的示例,我看到了同样的问题(相关提交在这里)。
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

处理此问题的最佳方法是确保您的导入范围在您的项目范围内;例如,而不是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

最终,这是预期的行为。这是德雷克问题和一个相关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


查看完整回答
反对 回复 2022-11-18
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信