Как удалить имена папок в импорте py_library?

#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__)