使用 pybind11 从 class 函数导出到 python 的额外打印

extra print from a class function exported to python using pybind11

这是 example.cpp 代码:

#include <pybind11/pybind11.h>
namespace py = pybind11;


int add(int i, int j) {
    return i + j;
}

class mycl{
    public:
    mycl(){};
    mycl(int a){
        age = a;
    };
    void call(){
    printf("I'm here!\n");
    }
    int ask_age(){
        printf("my age is %d\n", age);
    }
    private:
    int age;
};

class mycl myclv;
class mycl *pmycl = &myclv;

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    using namespace pybind11::literals;
    m.def("add", &add, //"A function which adds two numbers",
         "i"_a, "j"_a);
         //py::arg("i"), py::arg("j"));
    py::object omycl = py::cast("Pointer to mycl");
    m.attr("ptr") = omycl;
    py::class_<mycl>(m, "mycl")
    .def(py::init<int>())
    .def("AskAge",&mycl::ask_age);
}

我编译如下(我这里有 pybind11 模块):

c++ -std=c++11 example.cpp -fPIC -shared `python3 -m pybind11 --include` -o example.so

这里是 python3 执行结果:

ckim@chan-ubuntu:~/PYBIND11/pybind11$ python3
Python 3.5.2 (default, Jul 17 2020, 14:04:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> a = example.mycl(53)
>>> a.AskAge()
my age is 53
13
>>> b = example.mycl(54)
>>> b.AskAge()
my age is 54
13
>>> 

我不知道 13 来自哪里。有什么问题?

C++ printf returns 打印的字符总数(参见 here)。 您将 AskAge() 绑定到 ask_age,其中 return 是 int。由于 printf 也 return 和 int,我想这就是导致解释器打印 13 的原因,因为句子 my age is 54 有 13 个字符长(\n 最后)。

如果你 运行 这个程序不是来自 interpreter,它就不会 return 13.