如何在 Python 中调用 Bazel 生成的 C++ .so 文件中的 function/classes?
How to call function/classes in c++ .so files, generated by Bazel, in Python?
假设我在 hello.h
中有一个简单的 class
#ifndef LIB_HELLO_GREET_H_
#define LIB_HELLO_GREET_H_
class A{
public:
int a = 0;
int b = 0;
int add(){
return a+b;
}
};
#endif
使用 bazel 构建文件:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_library(
name = "hello",
hdrs = ["hello.h"],
)
cc_binary(
name = "hello.so",
deps = [
":hello",
],
linkshared=True,
linkstatic=False
)
我在运行bazel build hello.so
后,在bazel-bin/main
和bazel-bin/main/hello.so.runfiles/__main__/main/hello.so
中生成了一个共享对象文件。使用这些文件,我想用 python 脚本调用 class A
。理想情况下,我想使用 cppyy 或类似的东西。
我试过简单的 python 脚本
import cppyy
cppyy.load_reflection_info('hello')
print(dir(cppyy.gbl))
或
import cppyy
cppyy.load_library('hello')
print(dir(cppyy.gbl))
有两个 .so 文件,但 cppyy 似乎无法检测到 class A
- 它永远不会在 cppyy.gbl
中
我想知道解决这个问题的最佳方法,感谢任何帮助!
使用cppyy,还需要给它头文件,即:
cppyy.include("hello.h")
并可选择使用cppyy.add_include_path()
添加hello.h
所在的目录,以便可以找到它。
另一种方法是使用 so-called“字典”。这些包(可定制)目录位置、必要头文件的名称和(通过链接)共享库与实现成为一个新的共享库(由于历史原因被命名为“字典”)。旁边可以有一个 so-called“rootmap”文件,允许 class 加载器在第一次使用时自动找到 A
。请参阅 documentation.
中的示例
假设我在 hello.h
#ifndef LIB_HELLO_GREET_H_
#define LIB_HELLO_GREET_H_
class A{
public:
int a = 0;
int b = 0;
int add(){
return a+b;
}
};
#endif
使用 bazel 构建文件:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_library(
name = "hello",
hdrs = ["hello.h"],
)
cc_binary(
name = "hello.so",
deps = [
":hello",
],
linkshared=True,
linkstatic=False
)
我在运行bazel build hello.so
后,在bazel-bin/main
和bazel-bin/main/hello.so.runfiles/__main__/main/hello.so
中生成了一个共享对象文件。使用这些文件,我想用 python 脚本调用 class A
。理想情况下,我想使用 cppyy 或类似的东西。
我试过简单的 python 脚本
import cppyy
cppyy.load_reflection_info('hello')
print(dir(cppyy.gbl))
或
import cppyy
cppyy.load_library('hello')
print(dir(cppyy.gbl))
有两个 .so 文件,但 cppyy 似乎无法检测到 class A
- 它永远不会在 cppyy.gbl
我想知道解决这个问题的最佳方法,感谢任何帮助!
使用cppyy,还需要给它头文件,即:
cppyy.include("hello.h")
并可选择使用cppyy.add_include_path()
添加hello.h
所在的目录,以便可以找到它。
另一种方法是使用 so-called“字典”。这些包(可定制)目录位置、必要头文件的名称和(通过链接)共享库与实现成为一个新的共享库(由于历史原因被命名为“字典”)。旁边可以有一个 so-called“rootmap”文件,允许 class 加载器在第一次使用时自动找到 A
。请参阅 documentation.