команда ‘Protoc’ в родительском каталоге выводит весь исходный каталог в каталог python_out

#protocol-buffers #grpc-python

#буферы протокола #grpc-python

Вопрос:

У меня есть каталог с именем, protos который содержит один .proto файл, но в конечном итоге будет содержать много. У этого каталога есть брат с именем app , куда я хотел бы поместить встроенные grpc файлы python.

Я пытаюсь написать простой скрипт bash, который будет вызывать protoc команду и создавать .proto файлы в protos , а также выводить встроенные файлы в app

Ниже tree показано, куда я поместил каждый файл.

 ├── build_protos.sh
└── trainingInstance (root module directory)
    |
    ├── app
    │   ├── app.py
    |   ├── (where I'd like my built files to go)
    |   |
    |   └──trainingInstance
    |      └──protos
    |         └──(where the built files actually go)
    |
    └── protos
        └── TrainingService.proto (what I'd like to compile)


  

При запуске build_protos.sh файл TrainingService.proto обнаруживается нормально и создается, но вместо того, чтобы помещать встроенный файл в ...trainingInstance/app/<file> , вместо этого он помещает его в ...trainingInstance/app/trainingInstance/protos/<file> (см. Выше).

Я думал, что решил эту проблему, явно установив proto_path значение protos , но, похоже, в любом случае это не волнует. Ниже мой build_protos.sh файл:

 #!/bin/bash

working_dir=$(pwd)
proto_dirs=($(pwd)/trainingInstance)

for dir in $proto_dirs
do
    srcdir=$dir/protos #./trainingInstance/protos
    destdir=$dir/app #./trainingInstance/app
    echo Building $dir protos...

    python3 -m grpc_tools.protoc
        -I $working_dir
        --proto_path=$srcdir
        --python_out=$destdir
        --grpc_python_out=$destdir
        $srcdir/*.proto #./trainingInstance/protos/*.proto

done
  

Итак, кто-нибудь знает, как запретить протоколу создавать эти отраженные каталоги в выходном каталоге? Приветствуется любая помощь.

Ответ №1:

Не прошло и 5 минут после публикации этого вопроса (после предварительной игры со скриптом в течение часа), как я решил свою собственную проблему: -I флаг, который указывает на мой рабочий каталог, заставляет protoc создавать файлы таким образом, поскольку он направлен на разделение разных .proto пакетов. Эта проблема устранена путем полного удаления -I флага.

Я чувствую, что должен оставить это здесь на случай, если у кого-то еще возникнет подобная проблема.

Комментарии:

1. действительно, вам определенно следует оставить это здесь, чтобы другие могли извлечь из этого выгоду.

2. Похоже, это не работает с pip install grpcio-tools-1.51.1 по состоянию на 2022-01-13. Сообщение: File does not reside within any path specified using --proto_path (or -I). You must specify a --proto_path which encompasses this file. Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).