Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
使用TensorFlow C API的Python扩展模块_Python_C_Tensorflow - Fatal编程技术网

使用TensorFlow C API的Python扩展模块

使用TensorFlow C API的Python扩展模块,python,c,tensorflow,Python,C,Tensorflow,我已经编写了一个Python扩展模块,它通过C API使用TensorFlow。我按照中所述安装了API。就其本身而言,我的模块工作正常。但是,如果我导入扩展模块并同时导入tensorflow,Python就会因为这个错误而崩溃 [libprotobuf ERROR external/protobuf_archive/src/google/protobuf/descriptor_database.cc:58] File already exists in database: tensorflow

我已经编写了一个Python扩展模块,它通过C API使用TensorFlow。我按照中所述安装了API。就其本身而言,我的模块工作正常。但是,如果我导入扩展模块并同时导入tensorflow,Python就会因为这个错误而崩溃

[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/descriptor_database.cc:58] File already exists in database: tensorflow/core/protobuf/master.proto
[libprotobuf FATAL external/protobuf_archive/src/google/protobuf/descriptor.cc:1370] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): 
libc++abi.dylib: terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): 
Abort trap: 6
我相信这是因为C API包含了它自己的TensorFlow的完整副本,所以现在我在同一个进程中同时加载了两个不同的副本


解决这个问题的办法是什么?如何让使用TensorFlow的Python代码同时调用使用TensorFlow的C代码?

TensorFlow使用Protobuf,通过注册具有特定名称的消息类型来全局存储数据

在您的例子中,TensorFlow和您的扩展都与Protobuf链接(可能是静态的),并且在初始化时尝试注册所有必要的消息。第一个(TensorFlow)成功,而第二个失败,消息指定某人(TensorFlow..)已经注册了这样的消息

尽量不要链接TensorFlow库(它依赖于Protobuf)并动态加载它

这可以使用
dlopen()
完成,但是您必须使用
dlsym()
手动获取所有TF方法,这与您想要的有点不同

如果您编译一个Python扩展,我猜您正在编译一个共享对象,因此我希望它与TensorFlow动态链接。您用于编译的命令行是什么?您是否使用了
-fPIC