#bazel #bazel-rules
#bazel #bazel-правила
Вопрос:
У меня проблема с пониманием каталогов импорта python из bazel. Учитывая дерево, подобное этому:
.
├── WORKSPACE
├── python_lib_a/
│ ├── BUILD
│ └── src/
│ └── package1/
│ └── folder1/
│ └── some_file.py
└── python_binary_a/
├── BUILD
└── src/
└── package1/
└── folder2/
└── python_binary.py
Как файл может python_binary.py
импортировать some_file.py
файл таким образом:
from package1.folder1.some_file import SomeClass
Я довольно новичок в Bazel, поэтому мои запросы Google могут быть неверными. Я не смог найти ни одного примера удаления / удаления имен папок.
Я готов написать пользовательские правила, если это необходимо. Что-то вроде плагина, который изменяет папки во время компиляции.
РЕДАКТИРОВАТЬ: В дополнение к принятому ответу я должен был добавить это к package1/__init__.py
файлам как в библиотеке, так и в двоичных папках src:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
Ответ №1:
Вероятно, есть способ сделать это, но способ, который определенно сработает, — переместить положение ваших BUILD
файлов
.
├── WORKSPACE
├── python_lib_a/
│ └── src/
│ ├── BUILD
│ └── package1/
│ └── folder1/
│ └── some_file.py
└── python_binary_a/
└── src/
├── BUILD
└── package1/
└── folder2/
└── python_binary.py
Тогда в python_lib_a
нем было бы так, как показано ниже, и вызывается из //python_lib_a/src:package1
py_library(
name = "package1",
srcs = glob(
["package1**/**/*.py"],
),
imports = ["."],
visibility = ["//visibility:public"],
)
Затем в другом сделайте
py_library(
name = "package2",
srcs = glob(
["package1**/**/*.py"],
),
imports = ["."],
visibility = ["//visibility:public"],
deps = [ '//python_lib_a/src:package1']
)
Комментарии:
1. Я думаю, вы могли бы сделать это без перемещения файлов сборки. Тогда у вас было бы
imports = ["src"]
.2. Глядя на сгенерированную переменную среды PYTHONPATH, проблема, похоже, решена, но я все еще получаю ошибку импорта. На этот раз это не
No module named package1
так, но это такNo module named package1.folder2
.3. решил это с помощью:
import pkgutil; __path__ = pkgutil.extend_path(__path__, __name__)