Python 3 Protobuf AttributeError 来自 FileDescriptor 依赖项列表

Python 3 Protobuf AttributeError from FileDescriptor dependencies list

我正在使用 protoc 将 protobuf 模式文件编译为 python 3,但是在通过 __init__.py__all__ 导入之后,我得到了一个 AttributeError来自 FileDescriptor 对象的 dependencies 列表。我认为我的情况很直观,但需要冗长的描述。我有一个 protobuf 模式导入另一个,都在同一个包中。这几乎像是一个循环依赖问题,在生成的 python 文件尝试引用它之前模块尚未初始化。

这是我编译前的目录结构:

company_package
    \ project_package
        \ bar.proto    # imports foo.proto
        \ foo.proto
        \ __init__.py  # exposes classes via __all__
    \ __init__.py      # has extend_path from pkgutil
build.sh

build.sh 包含:

protoc --python_out=. company_package/project_package/foo.proto
protoc --python_out=. company_package/project_package/bar.proto

一个独立的 foo.proto 包含:

syntax = "proto2";

package company;

message Foo {
    required string msg = 1;
}

并且,如上所述,依赖项 bar.proto 包含:

syntax = "proto2";

import "company_package/project_package/foo.proto";

package company;

message Bar {
    required Foo foo = 1;
}

company_package__init__.py 有通常的 pkgutil.extend_path 代码。 project_package__init__.py 包含:

from .foo_pb2 import Foo 
from .bar_pb2 import Bar 


__all__ = ['Foo', 'Bar']

调用sh build.sh后,目录结构为:

company_package
    \ project_package
        \ bar_pb2.py
        \ bar.proto
        \ foo_pb2.py
        \ foo.proto
        \ __init__.py
    \ __init__.py
build.sh

如果我在隔离的虚拟环境中打开 REPL 并执行以下行,我会收到此错误:

In [1]: from company_package.project_package import *
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-1-70765a748bd5> in <module>()
----> 1 from company_package.project_package import *

{omitted}/company_package/project_package/__init__.py in <module>()
      1 from .foo_pb2 import Foo
----> 2 from .bar_pb2 import Bar
      3~
      4~
      5 __all__ = ['Foo', 'Bar']

{omitted}/company_package/project_package/bar_pb2.py in <module>()
     22   serialized_pb=_b('\n)company_package/project_package/bar.proto\x12\x07\x63ompany\x1a)company_package/project_package/foo.proto\" \n\x03\x42\x61r\x12\x19\n\x03\x66oo\x18\x01 \x02(\x0b\x32\x0c.company.Foo')
     23   ,
---> 24   dependencies=[company_package.project_package.foo_pb2.DESCRIPTOR,])
     25 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
     26~

AttributeError: module 'company_package' has no attribute 'project_package'

郑重声明,我在 GitHub 上看到了臭名昭著的 Protobuf/Python 3 期 post,我可以肯定这不是同一期 problem.

我的主要问题是:为什么这行不通?这似乎是 protobuf 最简单的用例之一。

我的问题是我使用的是旧版本的协议编译器。您可以在 GitHub repository.

下载最新版本

现在问题已解决,这是我的版本信息:

$ protoc --version
libprotoc 3.5.0
$ pip show protobuf
Name: protobuf
Version: 3.5.0.post1
Summary: Protocol Buffers
Home-page: https://developers.google.com/protocol-buffers/
Author: protobuf@googlegroups.com
Author-email: protobuf@googlegroups.com
License: 3-Clause BSD License
Location: {omitted}/venv/lib/python3.5/site-packages
Requires: six, setuptools