如何在 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/mainbazel-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.

中的示例