Protobuf,在python3.6中编译后导入错误

时间:2019-03-05 13:31:47

标签: python python-3.x protocol-buffers

目录结构:

Application/
   proto/
     payload.proto
     lab_account.proto
     public_trail.proto
   protocompiled/
     payload_pb2.py
     lab_account_pb2.py

payload.proto的内容

syntax = "proto3";
import "lab_account.proto";
import "public_trail.proto";

如果我使用命令编译我的payload.proto文件,

 Application⟫ protoc --proto_path=./proto --python_out=./protocompiled payload.proto

已编译的payload_pb2.py没有必需的导入。这样的导入语句有误。

 import lab_account_pb2 as lab__account__pb2
 import public_trail_pb2 as public__trail__pb2

代替这个;

 import protocompiled.lab_account_pb2 as lab__account__pb2
 import protocompiled.public_trail_pb2 as public__trail__pb2

也提到了https://github.com/protocolbuffers/protobuf/issues/1491,但无法解决问题。

1 个答案:

答案 0 :(得分:1)

protobuf github中有一个关于此问题的开放issue 5374

在解决之前,我将使用以下变通办法:protoc运行sed脚本(至少对GNU sed起作用)之后,它将添加相对导入。

protoc $PATH/*.proto --python_out=$PROTOC_OUTDIR
sed -i $PROTOC_OUTDIR/*_pb2.py -e 's/^import [^ ]*_pb2/from . \0/'

但这仅在所有文件都在同一目录中时有效。需要更复杂的脚本来处理分布在多个目录中的文件。