【问题标题】:Setting PYTHONPATH for protocol buffers to import symbol_database为协议缓冲区设置 PYTHONPATH 以导入 symbol_database
【发布时间】:2015-12-25 11:25:15
【问题描述】:

我不明白为什么我不能让 python 获取我系统上的 google 协议缓冲区模块。

使用google protocol buffers 2.6.1的源码包,我创建了protobuf egg。使用 easy_install 安装后,一切正常。但是,对于我们的项目,我不希望人们必须安装 egg。所以相反,我想我会让同事安装一个特定于我们的构建系统的包,其中包含解包形式的 python 模块,并让 python 通过指定 PYTHONPATH 来获取它。但似乎无论我将 PYTHONPATH 设置为什么,python 都看不到包。

解压后的模块内容:

pkg
└── google
    ├── __init__.py
    ├── __init__.pyc
    └── protobuf
        ├── compiler
        │   ├── __init__.py
        │   └── plugin_pb2.py
        ├── descriptor_database.py
        ├── descriptor_pb2.py
        ├── descriptor_pool.py
        ├── descriptor.py
        ├── __init__.py
        ├── internal
        │   ├── api_implementation.cc
        │   ├── api_implementation_default_test.py
        │   ├── ...
        │   ├── wire_format.py
        │   └── wire_format_test.py
        ├── message_factory.py
        ├── message.py
        ├── pyext
        │   ├── cpp_message.py
        │   ├── descriptor.cc
        │   ├── ...
        │   ├── repeated_scalar_container.h
        │   └── scoped_pyobject_ptr.h
        ├── reflection.py
        ├── service.py
        ├── service_reflection.py
        ├── symbol_database.py <-----------------
        ├── text_encoding.py
        ├── text_format.py

无论我将 PYTHONPATH 设置为 pkg/、pkg/google 还是 pkg/google/protobuf,python 都无法获取 symbol_database.py。

我用

python -c "from google.protobuf import symbol_database as _symbol_database"

测试它是否有效。我正在运行 python 2.7。

为什么这不起作用?

【问题讨论】:

  • 将 PYTHONPATH 设置为 pkg/ 就足够了...但是您需要正确设置它,即。带有完整路径。
  • 我做到了。我不想用完整的路径来打扰你们。可以肯定的是:它需要指向包含 __init__.py 的目录,对吧?

标签: python python-2.7 protocol-buffers pythonpath


【解决方案1】:

我遇到了同样的问题,最终通过确保 protoc 与我正在使用的 google.protobuf 版本匹配来解决它。如果您有选择,您应该只使用两者中的最新版本。我需要在我正在修改的旧系统中使用旧版 google.protobuf 模块。

检查python版本

我没有确认这很重要,但以防万一。当 protoc 运行时,它可能会查看默认的 python 解释器的站点包,以查看您使用的是哪个版本的 protobufs。确保默认值是您想要的。我的系统有两个版本的python,默认版本有一个更新版本的protobufs。

将 protoc 版本与 protobufs 模块匹配

我不确定这是否记录在任何地方,但这似乎是一项要求。也许大多数开发人员都在使用最新的,所以这很少出现。您遇到的 symbol_database 导入错误是因为在 protoc 生成 python 接口时假定找到了更新版本的 protobufs。但是,当导入运行时,旧版本的 protobufs 可用,而 symbol_database 在旧版本中不可用。在 protobuf egg-info 目录 PKG-INFO 文件中查找版本。

另一个可能的原因是您尝试使用在另一个系统上生成的 *_pb2/3.py 文件。

构建旧版本的 protoc

较新的 protoc 版本有二进制版本,但 3.0 之前的版本没有。幸运的是,代码足够老,GCC 4.4.x 可以成功构建它(那些在 RH/CentOS 上运行的人会知道为什么这是一个祝福)。但不幸的是,旧版本已损坏。但不难修复:手动运行 autogen.sh 中的命令。主要问题是此脚本中 Google Test 的路径不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 2011-09-18
    • 1970-01-01
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多