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
我正在使用 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