Protoc путь ошибки
作成日: 2025年1月18日
作成日: 2025年1月18日
Что за ошибка
(.venv) PS C:\Users\user\Desktop\VOCHI_January\pythonProject> python -m grpc_tools.protoc -I . -I C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis --python_out=output --grpc_python_out=output C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis/google/api/http.proto C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis/google/api/annotations.proto C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/yandex/cloud/api/operation.proto C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis/google/rpc/status.proto C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/yandex/cloud/operation/operation.proto yandex/cloud/validation.proto C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/yandex/cloud/ai/stt/v3/stt_service.proto
C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/yandex/cloud/api/operation.proto: File does not reside within any path specified using --proto_path (or -I). You must sp
ecify 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).
Ошибка говорит о том, что protoc
«не видит» ваш .proto
-файл в указанных путях (параметрах -I
). Проще говоря, вы передаёте ему абсолютные пути к .proto
-файлам, а в -I
(или --proto_path
) указываете либо .
и некий другой каталог. protoc
не умеет сопоставлять абсолютные пути к файлам с теми, что подразумеваются относительными путями в -I
.
Чтобы исправить:
--proto_path
, и для файлов) указывайте как абсолютные, либо как относительные.-I
нужный абсолютный путь вплоть до корневой директории, содержащей все .proto
-файлы. Например:
bashpython -m grpc_tools.protoc \ -I C:/Users/user/Desktop/VOCHI_January/pythonProject \ -I C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis \ --python_out=output \ --grpc_python_out=output \ C:/Users/user/Desktop/VOCHI_January/pythonProject/cloudapi/third_party/googleapis/google/api/http.proto \ ...
C:/Users/user/Desktop/VOCHI_January/pythonProject
действительно является корневым каталогом, внутри которого лежат все .proto
-файлы (то есть путь cloudapi/yandex/cloud/api/operation.proto
корректно продолжает C:/Users/user/Desktop/VOCHI_January/pythonProject
).C:/Users/user/Desktop/VOCHI_January/pythonProject
) и оттуда вызывайте protoc
.-I .
(и при необходимости -I ./cloudapi/third_party/googleapis
), а сами .proto
-файлы в списке аргументов пропишите как относительные пути (например, cloudapi/yandex/cloud/api/operation.proto
, cloudapi/third_party/googleapis/google/api/http.proto
и т.д.). Главное — чтобы пути внутри -I
и пути к файлам совпадали друг с другом по структуре каталогов.Ваша текущая ошибка вызвана тем, что protoc
не «понимает», как привязать абсолютный путь C:/Users/.../cloudapi/yandex/cloud/api/operation.proto
к тому, что в -I
указано только .
(текущая папка) плюс ещё одна вложенная папка. Нужно сделать их согласованными, тогда protoc
сгенерирует Python-модули без этой ошибки.
можешь предоставить мне исправленный вариант с учётом последних замечаний для ввода в pycharm
Ниже приведён пример команды, которая должна корректно сгенерировать Python-модули, если вы сначала перейдёте в каталог C:/Users/user/Desktop/VOCHI_January/pythonProject
(то есть где лежат ваши файлы cloudapi/...
, yandex/...
и т. д.).
cloudapi
и yandex
):
bashcd C:/Users/user/Desktop/VOCHI_January/pythonProject
bashpython -m grpc_tools.protoc \ -I . \ -I ./cloudapi/third_party/googleapis \ --python_out=output \ --grpc_python_out=output \ cloudapi/third_party/googleapis/google/api/http.proto \ cloudapi/third_party/googleapis/google/api/annotations.proto \ cloudapi/yandex/cloud/api/operation.proto \ cloudapi/third_party/googleapis/google/rpc/status.proto \ cloudapi/yandex/cloud/operation/operation.proto \ yandex/cloud/validation.proto \ cloudapi/yandex/cloud/ai/stt/v3/stt_service.proto
Обратите внимание:
-I .
означает «искать файлы начиная с текущей папки (.
)» — той, куда вы перешли с помощью cd
.-I ./cloudapi/third_party/googleapis
добавляет в список директорий ещё одну папку с протобуфами от Google..proto
файлу указываются относительно корня, в котором мы находимся (то есть cloudapi/...
, yandex/...
), а не абсолютными путями C:/...
.Таким образом, protoc
сможет «увидеть» каждый файл и правильно их обработать.
python -m grpc_tools.protoc -I . -I ./cloudapi/third_party/googleapis --python_out=output --grpc_python_out=output cloudapi/third_party/googleapis/google/api/http.proto cloudapi/third_party/googleapis/google/api/annotations.proto cloudapi/yandex/cloud/api/operation.proto cloudapi/third_party/googleapis/google/rpc/status.proto cloudapi/yandex/cloud/operation/operation.proto yandex/cloud/validation.proto cloudapi/yandex/cloud/ai/stt/v3/stt_service.proto
Could not make proto path relative: yandex/cloud/validation.proto: No such file or directory
Сообщение об ошибке:
Could not make proto path relative: yandex/cloud/validation.proto: No such file or directory
означает, что указанный файл yandex/cloud/validation.proto
не найден по относительному пути из текущего каталога (C:/Users/user/Desktop/VOCHI_January/pythonProject
), либо путь указан неверно.
Чтобы исправить:
Проверьте наличие файла
Убедитесь, что файл validation.proto
действительно существует по пути C:/Users/user/Desktop/VOCHI_January/pythonProject/yandex/cloud/validation.proto
. Если его нет, проверьте его расположение: возможно, он находится в другой директории.
Исправьте путь
Если файл расположен в другой директории, скорректируйте путь в команде. Например, если файл лежит в cloudapi/yandex/cloud/validation.proto
, используйте этот путь:
bashcloudapi/yandex/cloud/validation.proto
или, если он лежит где-то ещё, укажите корректный относительный путь.
Обновлённая команда
Предполагая, что файл validation.proto
отсутствует или находится в другом месте, скорректируйте команду, исключив ошибочный путь или заменив на правильный. Например, если файла нет и вам не нужен этот файл:
bashpython -m grpc_tools.protoc \ -I . \ -I ./cloudapi/third_party/googleapis \ --python_out=output \ --grpc_python_out=output \ cloudapi/third_party/googleapis/google/api/http.proto \ cloudapi/third_party/googleapis/google/api/annotations.proto \ cloudapi/yandex/cloud/api/operation.proto \ cloudapi/third_party/googleapis/google/rpc/status.proto \ cloudapi/yandex/cloud/operation/operation.proto \ cloudapi/yandex/cloud/ai/stt/v3/stt_service.proto
Если файл validation.proto
существует, уточните его местоположение и обновите путь в команде соответственно. Например, если он находится по пути cloudapi/yandex/cloud/validation.proto
, замените yandex/cloud/validation.proto
на этот относительный путь:
bashpython -m grpc_tools.protoc \ -I . \ -I ./cloudapi/third_party/googleapis \ --python_out=output \ --grpc_python_out=output \ cloudapi/third_party/googleapis/google/api/http.proto \ cloudapi/third_party/googleapis/google/api/annotations.proto \ cloudapi/yandex/cloud/api/operation.proto \ cloudapi/third_party/googleapis/google/rpc/status.proto \ cloudapi/yandex/cloud/operation/operation.proto \ cloudapi/yandex/cloud/validation.proto \ cloudapi/yandex/cloud/ai/stt/v3/stt_service.proto
Таким образом, убедитесь, что все указанные пути корректны относительно текущего каталога, и команда должна выполниться успешно.