Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为协议缓冲区设置PYTHONPATH以导入符号\u数据库_Python_Python 2.7_Protocol Buffers_Pythonpath - Fatal编程技术网

为协议缓冲区设置PYTHONPATH以导入符号\u数据库

为协议缓冲区设置PYTHONPATH以导入符号\u数据库,python,python-2.7,protocol-buffers,pythonpath,Python,Python 2.7,Protocol Buffers,Pythonpath,我不明白为什么我不能让python获取我系统上的google协议缓冲模块 使用GoogleProtocolBuffersVersion2.6.1的源程序包,我创建了ProtobufEgg。使用easy_install安装后,一切正常。然而,对于我们的项目,我不希望人们必须安装鸡蛋。因此,我想我应该让同事安装一个特定于构建系统的包,该包包含解包形式的python模块,并让python通过指定PYTHONPATH来获取它。但似乎无论我将PYTHONPATH设置为什么,python都看不到包 未打包模

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

使用GoogleProtocolBuffersVersion2.6.1的源程序包,我创建了ProtobufEgg。使用easy_install安装后,一切正常。然而,对于我们的项目,我不希望人们必须安装鸡蛋。因此,我想我应该让同事安装一个特定于构建系统的包,该包包含解包形式的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
测试它是否有效。我正在运行python 2.7


为什么这不起作用?

我也遇到了同样的问题,通过确保protoc与我使用的google.protobuf版本匹配,最终解决了这个问题。如果你有选择的话,你应该选择两者中最新的一种。我需要在我正在修改的遗留系统中使用遗留的google.protobuf模块

检查python版本

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

将protoc版本与protobufs模块匹配

我不确定这是否有文档记录,但这似乎是一项要求。也许大多数开发人员都在使用最新版本,所以很少出现这种情况。发生symbol_数据库导入错误是因为在protoc生成python接口时,假定发现了protobufs的最新版本。但是,在运行导入时,protobufs的旧版本可用,而symbol_数据库在旧版本中不可用。在protobuf egg info目录PKG-info文件中查找版本

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

构建较旧版本的protoc


较新版本的protoc有二进制版本,但不是3.0之前的版本。幸运的是,代码已经足够老了,GCC4.4.x可以成功地构建它(在RH/CentOS上运行的人会知道为什么这是一件好事)。但不幸的是,旧版本被破坏了。但不难修复:手动运行autogen.sh中的命令。主要问题是此脚本中的Google测试路径不正确。

将PYTHONPATH设置为pkg/应该足够了。。。但是你需要把它设置好,就是用完整的路径。我做到了。我不想用完整的路径来打扰你们。可以肯定的是:它需要指向包含uuu init_uuuu.py的目录,对吗?
python -c "from google.protobuf import symbol_database as _symbol_database"