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