【问题标题】:How to strip folder names in py_library imports?如何在 py_library 导入中去除文件夹名称?
【发布时间】:2021-03-16 04:26:50
【问题描述】:

我在理解 bazel 的 python 导入目录时遇到问题。 给定一棵这样的树:

.
├── 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 很陌生,所以我的谷歌查询可能是错误的。我找不到任何删除/剥离文件夹名称的示例。 如有必要,我愿意编写自定义规则。类似于在编译期间更改文件夹的插件。

编辑:除了接受的答案之外,我还必须将其添加到库和二进制 src 文件夹中的 package1/__init__.py 文件中:

import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)

【问题讨论】:

    标签: bazel bazel-rules


    【解决方案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']
    )
    

    【讨论】:

    • 我认为您可以在不移动构建文件的情况下执行此操作。然后你会得到imports = ["src"]
    • 查看生成的 PYTHONPATH 环境变量,问题似乎已解决,但我仍然收到导入错误。这次不是No module named package1,而是No module named package1.folder2
    • 已解决:import pkgutil; __path__ = pkgutil.extend_path(__path__, __name__)
    猜你喜欢
    • 2020-07-28
    • 2016-09-02
    • 2018-04-23
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多