Python не удается импортировать пакет из зависимости gaz_repository () от bazel - PullRequest
1 голос
/ 06 февраля 2020

У меня есть два git репозитория с кодом python.

https://github.com/SurferJeffAtGoogle/synthtool/tree/bazel содержит две цели сборки:

~/gitrepos/synthtool$ bazel query ...
//tests:synthtool_test
//synthtool:synthtool

https://github.com/SurferJeffAtGoogle/nodejs-vision/tree/bazel содержит одну цель сборки:

~/gitrepos/nodejs-vision$ bazel query ...
//:synth

//tests:synthtool_test и //:synth оба зависят от //synthtool:synthtool.

Я могу запустить тест, и тестовый код успешно импортируется synthtool:

~/gitrepos/synthtool$ bazel test ...
INFO: Analyzed 2 targets (4 packages loaded, 230 targets configured).
INFO: Found 1 target and 1 test target...
INFO: Elapsed time: 7.477s, Critical Path: 7.07s
INFO: 2 processes: 2 linux-sandbox.
INFO: Build completed successfully, 3 total actions
//tests:synthtool_test                                                   PASSED in 7.0s

Executed 1 out of 1 test: 1 test passes.

Однако, когда я пытаюсь запустить //:synth, он не может импортировать synthtool:

~/gitrepos/nodejs-vision$ bazel run //:synth
Starting local Bazel server and connecting to it...
INFO: Analyzed target //:synth (17 packages loaded, 272 targets configured).
INFO: Found 1 target...
INFO: Deleting stale sandbox base /usr/local/google/home/rennie/.cache/bazel/_bazel_rennie/dadb642c5feb5ae86ab3
1dcb8a48c54a/sandbox
Target //:synth up-to-date:
  bazel-bin/synth
INFO: Elapsed time: 2.555s, Critical Path: 0.03s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Traceback (most recent call last):
  File "/usr/local/google/home/rennie/.cache/bazel/_bazel_rennie/dadb642c5feb5ae86ab31dcb8a48c54a/execroot/nodejs_vision/bazel-out/k8-fastbuild/bin/synth.runfiles/nodejs_vision/synth.py", line 18, in <module>
    import synthtool.gcp as gcp
ModuleNotFoundError: No module named 'synthtool.gcp'
rennie@rennie:~/gitrepos/nodejs-vision$ 

Обе цели имеют одинаковую строку кода:

import synthtool.gcp as gcp

Это успешно для тестов, но не для //:synth.

Я вижу, что нужные файлы были выбраны и попали в каталоги вывода Blaze, но synth.py не удается импортируйте их:

~/gitrepos/nodejs-vision$ find -L bazel-* -name gcp
bazel-bin/synth.runfiles/nodejs_vision/external/synthtool/synthtool/gcp
bazel-bin/synth.runfiles/synthtool/synthtool/gcp
bazel-nodejs-vision/external/synthtool/synthtool/gcp
bazel-nodejs-vision/bazel-out/k8-fastbuild/bin/synth.runfiles/nodejs_vision/external/synthtool/synthtool/gcp
bazel-nodejs-vision/bazel-out/k8-fastbuild/bin/synth.runfiles/synthtool/synthtool/gcp
bazel-out/k8-fastbuild/bin/synth.runfiles/nodejs_vision/external/synthtool/synthtool/gcp
bazel-out/k8-fastbuild/bin/synth.runfiles/synthtool/synthtool/gcp

Почему это так? Как мне это исправить?

1 Ответ

0 голосов
/ 07 февраля 2020

Это похоже на случай, когда имя репо (@synthtool) скрывает имя пакета (//synthtool). Дерево исполняемых файлов вашей неуспешной цели выглядит примерно так:

<runfiles>/synthtool/synthtool/foo.py
     ^          ^        ^       ^
   root         |        |       |
           repo root     |       |
                      package    |
                              modules

Правила Python добавляют каждый репо root к PYTHONPATH, а также сам файл запуска root. (См., Например, # 7067 .) Это означает, что как первый, так и второй фрагменты пути выше находятся на вашем PYTHONPATH. Вы хотите, чтобы import synthtool был разрешен относительно репо root, чтобы он захватывал пакет, но вместо этого он получал разрешение относительно исполняемых файлов root, поэтому он пытался импортировать репо root.

Вы должны быть в состоянии уменьшить это, переименовав пакет и / или хранилище.

...