es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ruta de tiempo de ejecución hacia el archivo de datos en repositorio externo.

Digamos que tengo dos repositorios de Bazel siguientes (repositorio git):

repos
├── data
│    ├── BUILD.bazel
│    ├── external-data.txt
│    └── WORKSPACE
└── foo
    ├── BUILD.bazel
    ├── foo.py
    ├── local-data.txt
    └── WORKSPACE

Estoy intentando averiguar cómo el script foo.py del repositorio foo puede acceder a external-data.txt del repositorio data en tiempo de ejecución.

Hasta ahora, he configurado que el repositorio data define un grupo de archivos públicos para external-data.txt:

BUILD.bazel (data)

filegroup(
    name = "data",
    srcs = ["external-data.txt"],
    visibility = ["//visibility:public"],
)

Y el repositorio foo declara el repositorio data como una dependencia…

WORKSPACE (foo)

local_repository(
    name = "data",
    path = "../data",
)

y luego hace referencia al grupo de archivos como datos que se utilizarán durante la ejecución para foo.py:

BUILD.bazel (foo)

py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [
        "local-data.txt",
        "@data//:data"
    ]
)

Pero, de nuevo, no estoy seguro de qué ruta debería usar para acceder a external-data.txt en tiempo de ejecución:

foo.py

import os

def dump_file(file_path):
    print(file_path + ":")
    with open(file_path) as file:
        print(file.read())

def main():
    data_files = [
        'local-data.txt', # No hay problemas aquí
        # ¿Qué ruta debo usar para acceder a @data//:external-data.txt?
    ]
    for file in data_files:
        dump_file(file)

print("cwd: " + os.getcwd())

if __name__ == "__main__":
    main()

Para contextualizar, estoy usando Bazel versión 4.1.0 con la bandera --nolegacy_external_runfiles:

bazel run //:foo --nolegacy_external_runfiles --sandbox_debug

La salida de ese comando es la siguiente:

local-data.txt:
foo
bar
baz
cwd: /home/$USER/.cache/bazel/bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/main/bazel-out/k8-fastbuild/bin/foo.runfiles/main

No estoy seguro de que sea relevante, pero cuando examino el directorio que foo.py muestra como “cwd”, puedo encontrar el archivo external-data.txt en esta ruta relativa:

../../../../../../../../../../../experiments/repos/data/external-data.txt

Que es la siguiente ruta absoluta:

/home/$USER/.cache/bazel/_bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/__main__/external/data

(¿Parece que en general la ruta para archivos externos debería ser algo como execroot/$WORKSPACE/external/$EXTERNAL_WORKSPACE?)

Tags:  

Answer

  1. Avatar for davy.ai

    Para acceder al archivo external-data.txt del repositorio data durante la ejecución en foo.py, debes utilizar la siguiente ruta:

    @data//external:data/external-data.txt
    

    Esto resolverá a los archivos ejecutables del repositorio data, donde se encuentra external-data.txt.

    En tu script foo.py, debes modificar la lista data_files de la siguiente manera:

    data_files = [
        'local-data.txt',
        '@data//external:data/external-data.txt'
    ]
    

    Esto te permitirá acceder al contenido de external-data.txt durante la ejecución.

    En cuanto a la ruta para los archivos externos, como se observó, debe tener la forma execroot/$WORKSPACE/external/$EXTERNAL_WORKSPACE, donde $WORKSPACE es el espacio de trabajo actual y $EXTERNAL_WORKSPACE es el nombre del espacio de trabajo externo. En este caso, como data es un repositorio local, el $EXTERNAL_WORKSPACE es data.

Comments are closed.