我已经处理这个问题好几个星期了,急需帮助!因此,提前感谢您对如何将 protobufs 编译为 pb2.py 文件的任何见解,以便在 Google Cloud Build 期间您的工作区的其余部分可以访问它们。
迄今为止的尝试:
我首先尝试使用 google-cloud-builders, protoc image。我能够成功地将图像推送到构建器项目注册表,但我不确定我是否能够正确安装 python 插件。
这是我的 cloud_build.yaml 步骤:
- name: gcr.io/eco-env-238021/protoc args: - --proto-path=./protos - --python_out=./protos - ./protos/A.proto
我不断收到错误阅读:
failed: starting step container failed: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "protoc": executable file not found in $PATH: unknown
接下来,我尝试使用可安装 pip 的 grpcio-tools python 包来编译原型。这更加成功,因为我实际上能够生成 pb2.py文件。不过,我的兴奋是短暂的。在云构建期间,我调用了一个测试文件,该文件导入了一个 pb2.py 文件,我们将其命名为 A。现在,当 A 导入另一个 pb2.py 文件时,我得到一个模块未找到错误,我'将称为 B。我已经打印出云构建环境中的目录结构,并且 A 和 B 都存在,并且 A 肯定可以访问 B(它们存在于同一个包中)。
这是目录结构:
C:.
| cloudbuild.yaml
| __init__.py
|
+---protos
| A_pb2.py
| B_pb2.py
| __init__.py
|
+---tests
| test.py
Here is my cloud_build.yaml step:
- name: python:3.7
args: ["python", "-m", "grpc_tools.protoc", "-I", "./protos",
"--python_out=./protos", "./protots/A.proto"]
- name: python:3.7
args: ["python", "-m", "grpc_tools.protoc", "-I", "./protos",
"--python_out=./protos", "./protots/B.proto"]
- name: python:3.7
args: ["python","-m","unittest","discover","--verbose","-s","./tests/",
"-p","test.py"]
id: unittest
模块导入错误可能与 protobuf 文件的编译完全无关,只是云构建环境的一个属性。不过,我确实注意到,如果我在存储库中预编译触发云构建的 protobuf 文件,则一切正常。或者,如果我在我的 PC 上遵循相同的过程,一切正常。我只是不明白文件如何存在但不可导入。