将Drake用作Bazel外部时PYTHONPATH中出现意外路径

2024-05-18 05:13:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在另一个bazel项目中将drake用作外部,它将...runfiles/drake以及...runfiles/drake/bindings添加到PYTHONPATH。后者几乎只包括pydrake(这是我想要的),但前者包括一系列其他目录作为模块,包括公共、示例、工具和绑定,这会导致与我自己的项目发生名称冲突。这是预期的行为吗?处理这个问题的最好方法是什么?我在drake external examples/drake_bazel_external中测试了这些示例,我看到了相同的问题(相关提交here


Tags: 模块工具项目方法目录名称示例bindings
1条回答
网友
1楼 · 发布于 2024-05-18 05:13:53

TL;DR处理这个问题的最佳方法是确保您的导入适用于您的项目;e、 代替from common import foo,改为from drake_bazel_external.common import foo

下面是一个样例Bazel项目的片段,它使用Python实现了这一点:

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


根本原因是,我尝试用更多的输出来插入您的repo,并固定到drake@v0.18.0

^{}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

最终,这是预期的行为。这是德雷克问题,以及一个相关的bazelbuild问题:

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

我将重新讨论德雷克问题,但由于有更好的解决方案(IMO),我将保持低优先级,并将需要更多的基础设施工作来实现这一点

谢谢

编辑:具体地说,最让您的示例大吃一惊的是Bazel正在生成@drake//common:__init__.py。它的生成只是因为legacy_create_init标志,以及我们需要文件libdrake_marker.so的事实

还有一个事实是drake(以及其他存储库)根本就在Python上

编辑2:根据杰里米的请求提交了一份新的文件:https://github.com/RobotLocomotion/drake/issues/13320

相关问题 更多 >