使用 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
.
这是 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
.