如何通过python方法和kwargs来提升python的c++函数和调用

how to pass python method and kwargs to boost python c++ function and call

本文关键字:python c++ 函数 调用 何通过 方法 kwargs      更新时间:2023-10-16

如何将python方法和kwargs传递给boost C++函数,并用kwargs调用python方法。

python:

def py_method(**kwargs):
for key in kwargs.keys():
print 'Key: ', key, ', Value: ', kwargs[key]
cpp_method(py_method, arg1=1, arg2=2)
or
kwargs = {'arg1': 1, 'arg2': 2}
cpp_method(py_method, **kwargs)

C++:请帮我更正下面的代码。

using namespace boost::python;
void cpp_method(object py_method, object kwargs)
py_method(kwargs)

感谢Dan Mašek指向此链接

在MacOS HighSierra上编译并得到分割错误:

g++ -std=c++11 -I/Library/Frameworks/Python.framework/Versions/2.7/Headers -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"foo.d" -MT"foo.o" -o "foo.o" foo.cpp
g++ -L/usr/local/lib -L/Library/Frameworks/Python.framework/Versions/2.7/ -shared -o foo.so  ./foo.o   -lboost_python27 -lPython
$ python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 12:01:12) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> dir(foo)
['__doc__', '__file__', '__name__', '__package__', 'cpp_method']
>>> def py_method(**kwargs):
...     print 'from py_method'
...     print kwargs
... 
>>> kwargs = {'arg1': 1, 'arg2': 2}
>>> foo.cpp_method(py_method, kwargs)
Segmentation fault: 11
进程:Python〔22790〕路径:/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python_app/Contents/MacOS/Python标识符:Python版本:2.7.14(2.7.14)代码类型:X86-64(本机)父进程:bash[368]责任人:Python[22790]用户ID:501日期/时间:2018-10-04 16:54:51.618-0700操作系统版本:Mac OS X 10.13.6(17G65)报告版本:12匿名UUID:3A7BC812-2E65-69A4-936B-21E5CE648BCF睡眠/唤醒UUID:E32B82BD-2B4C-4220-A9C2-F71FF57DDA56开机后唤醒时间:58万秒唤醒后的时间:2700秒系统完整性保护:已禁用崩溃的线程:0调度队列:com.apple.main-read异常类型:EXC_BAD_ACCESS(SIGSEGV)异常代码:位于0x0000000000000048的KERN_INVALID_ADRESS例外说明:EXC_CORPSE_NOTIFY终止信号:分段故障:11终止原因:命名空间SIGNAL,代码0xb正在终止进程:exc处理程序[0]0x48附近的VM区域:-->__TEXT 0000000 100000000-0000000 100001000[4K]r-x/rwx SM=COW/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python_app/Contents/MacOS/Python线程0崩溃::调度队列:com.apple.main-read0 org.python.python 0x00007fff3bfeace5c PyErr_Occured+141 org.python.python 0x00007fff3bf2df5PyObject_IsInstance+4012 foo.so 0x0000000100799aaf boost::python::converter::pyobject_type::check(_object*)+31(pyobject_type.hpp:24)3 foo.so 0x0000000100799918 boost::python::converter::object_manager_value_arg_from_python::conversible()const+24(obj_mgr_arg_from _python.hpp:69)4 foo.so 0x00000001007997e1 boost::python::detail::caller_arity::impl>::operator()(_object*,_object*)+129(local.hpp:37)5 foo.so 0x00000001007996e4 boost::python::objects::caller_py_function_impl>>::operator()(_object*,_object*)+52(py_functions.hpp:38)6 libboost_python27.dylib 0x000000010190e1a4 boost::python::objects::function::call(_object*,_object*)const+8207 libboost_python27.dylib 0x0000000101910d5a boost::detail::function::void_function_ref_invoker0::invoke8 libboost_python27.dylib 0x0000000101916f48 boost::python::handle_exception_inimpl(boost:;function0)+729 libboost_python27.dylib 0x0000000101910871 boost::python::objects::function_call(_object*,_object*)+8110 org.python.python 0x000000010000c2e2 PyObject_Call+9811 org.python.python 0x00000001000c30b1 PyEval_EvalFrameEx+1577712 org.python.python 0x00000001000cac23 PyEval_EvalCodeEx+211513 org.python.python 0x00000001000cad46 PyEval_EvalCode+5414 org.python.python 0x00000001000ef7ec PyRun_InteractiveOneFlags+38015 org.python.python 0x00000001000efa4e PyRun_InteractiveLoopFlags+7816 org.python.python 0x00000001000f0261 PyRun_AnyFileExFlags+16117 org.python.python 0x00000001001071dd Py_Main+310118 org.python.python 0x0000000100000f14 0x100000000+3860线程0崩溃,X86线程状态(64位):rax:0x000000000000000rbx:0x0000000000002 rcx:0x000000000001 rdx:0x00000000003rdi:0x00007fff8cc80458 rsi:0x00000001007b4030 rbp:0x00007ffeefbff210 rsp:0x00007 ffeefbff110r8:0x00000001007b4030 r9:0x8c8b1dcac69804a r10:0x0000000000001002 r11:0xffff8001c47c5769r12:0x0000000000000000r13:0x0000000100702a70 r14:0x0000000100728280 r15:0x00007fff8cc784f0rip:0x00007fff3bfee5c rfl:0x0000000000010246 cr2:0x0000000000000048逻辑CPU:3错误代码:0x00000004陷阱编号:14二进制图像:0x100000000-0x100000fff+org.python.python(2.7.14-2.7.14)/库/框架/python.framework/Versions/2.7/Resources/python.app/Contents/MacOS/python0x100003000-0x100177fef+org.python.python(2.7.14,[c]2001-2017 python软件基础。-2.7.114)/Library/Frameworks/python.framework/Versions/2.7/python0x1002ec000-0x1002eeff7+_locale.so(??)/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_lale.so0x1002f2000-0x1002f4f7+readline.so(??)/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/readline.so0x100730000-0x100784fe7+libncursesws.5.dylib(5)/Library/Frameworks/Python.framework/Versions/2.7/lib/libncursES.5.dylib0x100795000-0x10079fff+foo.so(0)/Users/USER/*/foo.so0x101900000-0x10192dfff+libboost_python27.dylib(0)/usr/local/opt/boost-python/lib/libboost_prython27_dylib0x10c12a000-0x10c174acf dyld(551.4)/usr/lib/dyd0x7fff3170100-0x7fff31ba2fef com.apple.CoreFoundation(6.9-1454.90)/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation0x7fff3bf21000-0x7fff3c010ff7 org.python.python(2.7.10-2.7.10)/System/Library/Frameworks/python.framework/Versions/2.7/python0x7fff56da2000-0x7fff56dd5ff7 libclosured.dylib(551.4)/usr/lib/colosure/libclosured.dylib0x7fff56f66000-0x7fff56f67ff3 libDiagnosticsMessagesClient.dylib(104)/usr/lib/libDiagnosticsMessagesCClient.dylib0x7fff572dc000-0x7fff472ddffb libSystem.B.dylib(1252.50.4)/usr/lib/libSystem.B.dyib0x7fff57511000-0x7fff 57567fff libc++.1.dylib(400.9)/usr/lib/libc++.1.dyleb0x7fff57568000-0x7fff45758cff7 libc++abi.dylib(400.8.2)/usr/lib/libc++abi.dyleb0x7fff57ec3000-0x7fff57ee1ff7 libedit.3.dylib(50)/usr/lib/libdedit.3.dyib0x7fff5803c000-0x7fff 58263ffb libicucore。A.dylib(59180.0.1)/usr/lib/libicucore.A.dylib0x7fff585c0000-0x7fff385f0fb libncurses.5.4.dylib(53)/usr/lib/libncures.5.4.dylib0x7fff58995000-0x7fff58d837e7 libobjc。A.dylib(723)/usr/lib/liobjc.A.dylib0x7fff593ab000-0x7fff393bdffb libz.1.dylib(70)/usr/lib/libz.1.dlib0x7fff59459000-0x7fff45945dff7 libcache.dylib(80)/usr/lib/system/libcache.dylib0x7fff5945e000-0x7fff459468ff3 libcommonCrypto.dylib(60118.50.1)/usr/lib/system/libcommonCrypto.dyleb0x7fff59469000-0x7fff459470fff libcompiler_rt.dylib(62)/usr/lib/system/libcompiler_rt-dylib0x7fff59471000-0x7fff45947affb libcopyfile.dylib(146.50.5)/usr/lib/system/libcopyfile.dylib0x7fff5947b000-0x7fff 59500fff libcorecrypto.dylib(562.70.1)/usr/lib/system/libcorecrypto_dylib0x7fff59588000-0x7fff3595c1ff7 libdispatch.dylib(913.60.2)/usr/lib/system/libdispatch.dylip0x7fff595c2000-0x7fff395dfff7 libdyld.dylib(551.4)/usr/lib/system/libdyl.dylib0x7fff595e000-0x7fff3595e0ffb libkeymgr.dylib(28)/usr/lib/system/libkeymgr.dylib0x7fff595ee000-0x7fff3595eeff7 liblaunch.dylib(1205.70.9)/usr/lib/system/liblanch.dylik0x7fff595ef000-0x7fff495f3ffb libmacho.dylib(906)/usr/lib/system/libmachio.dylib0x7fff595f4000-0x7fff495f6ff3 libisolation.dylib(86)/usr/lib/system/libsisolate.dylib0x7fff595f7000-0x7fff 595f8ff3 libremovefile.dylib(45)/usr/lib/system/libraemovefile-dylib0x7fff595f9000-0x7fff 59610fff libsystem_asl.dylib(356.70.1)/usr/lib/system/libsystem_asl.dlyib0x7fff59611000-0x7fff 59611fff libsystem_block.dylib(67)/usr/lib/system/libsystem_block.dlyib0x7fff59612000-0x7fff 5969bff7 libsystem_c.dylib(1244.50.9)/usr/lib/system/libsystem_c.dylip0x7fff5969c000-0x7fff35969fffb libsystem_configuration.dylib(963.50.8)/usr/lib/system/libsystem_configuration.dylib0x7fff596a0000-0x7fff 596a3ffb libsystem_coreserves.dylib(51)/usr/lib/system/libsystem_coreserve.dylib0x7fff596a4000-0x7fff 596a5fff libsystem_darwin.dylib(1244.50.9)/usr/lib/system/libsystem_darwin_dylib0x7fff596a6000-0x7fff596acff7 libsystem_dnssd.dylib(878.70.2)/usr/lib/system/libsystem_dnssd-dylib0x7fff596ad000-0x7fff 596f6ff7 libsystem_info.dylib(517.30.1)/usr/lib/system/libsystem_info.dlyib0x7fff596f7000-0x7fff1df7 libsystem_kernel.dylib(4570.71.2)/usr/lib/system/libsystem_kernel_dylib0x7fff5971e000-0x7fff359769fcb libsystem_m.dylib(3147.50.1)/usr/lib/system/libsystem_m.dylip0x7fff5976A00x7fff59789fff libsystem_malloc.dylib(140.50.6)/usr/lib/system/libsystem_malloc.dylib0x7fff5978a000-0x7fff 598baff7 libsystem_network.dylib(1229.70.2)/usr/lib/system/libsystem_network_dylib0x7fff598bb000-0x7fff 598c5ffb libsystem_networkextension.dylib(767.70.1)/usr/lib/system/libsystem_networkextension.dylib0x7fff598c6000-0x7fff3 libsystem_notify.dylib(172)/usr/lib/system/libsystem_notify_dylib0x7fff598d0000-0x7fff 598d7ff7 libsystem_platform.dylib(161.50.1)/usr/lib/system/libsystem_platform_dylib0x7fff598d8000-0x7fff 598e3fff libsystem_pthread.dylib(301.50.1)/usr/lib/system/libsystem_pthread_dylib0x7fff598e4000-0x7fff 598e7fff libsystem_sandbox.dylib(765.70.1)/usr/lib/system/libsystem_sandbox-dylib0x7fff598e8000-0x7fff3 libsystem_secinit.dylib(30)/usr/lib/system/libsystem_secinit_dylib0x7fff598ea000-0x7fff 598f1ff7 libsystem_symptoms.dylib(820.60.2)/usr/lib/system/libsystem_symptoms.dylib0x7fff598f2000-0x7fff 59905fff libsystem_trace.dylib(829.70.1)/usr/lib/system/libsystem_trace.dilib0x7fff59907000-0x7fff 5990cff7 libunund.dylib(35.3)/usr/lib/system/libund.dylib0x7fff5990d000-0x7fff 5993aff7 libxpc.dylib(1205.70.9)/usr/lib/system/libxpc.dyib外部修改总结:其他进程针对此进程进行的调用:task_for_pid:0线程创建:0thread_set_state:0此进程拨打的电话:task_for_pid:0线程创建:0thread_set_state:0此计算机上所有进程进行的调用:task_for_pid:577992线程创建:0thread_set_state:0VM区域摘要:库的只读部分:总计=213.0M驻留=0K(0%)swapped_out_or_unallocated=213.0M(100%)可写入区域:总计=38.3M已写入=0K(0%)驻留=0K虚拟区域区域类型大小计数(非合并)======================活动跟踪256K 2内核Alloc Once 8K 2MALLOC 29.5M 12MALLOC防护页16K 5烟囱防护装置56.0M 2堆栈8192K 2VM_ALLOCATE 256K 2__数据4532K 57__链接编辑193.6M 10__文本19.4M 55__UNICODE 560K 2共享存储器12K 4======================总计312.0M 143型号:MacBookPro12,1,BootROM MBP121.0177.B00,2个处理器,英特尔酷睿i7,3.1 GHz,16 GB,SMC 2.28f7图形:Intel Iris Graphics 6100、Intel Iris Graphics 6100,内置内存模块:BANK 0/DIMM0,8 GB,DDR3,1867 MHz,0x02FE,0x4544464232333241314D412D442D460000内存模块:BANK 1/DIMM0,8 GB,DDR3,1867 MHz,0x02FE,0x4544464232333241314D412D442D460000AirPort:spairport_wireless_card_type_AirPort_extreme(0x14E4,0x133),Broadcom BCM43xx 1.0(7.77.37.31.1a9)蓝牙:6.0.7f10版本,3项服务,27台设备,1个传入串行端口网络服务:Wi-Fi、AirPort、en0串行ATA设备:APPLE SSD SM0512G,500.28 GBUSB设备:USB 3.0总线USB设备:蓝牙USB主机控制器Thunderbolt总线:苹果股份有限公司MacBook Pro,27.1

我用pybind11解决了它,比boost-python容易得多

cpp.cpp:

#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;
void cpp_method(py::object method, py::kwargs kw) {
py::object obj = method(**kw);
std::cout << "Printing from cpp: " << std::string(py::str(obj)) << std::endl;
}
PYBIND11_MODULE(cpp, mod) {
mod.def("cpp_method", &cpp_method);
}

编译:

c++ -O3 -Wall -shared -std=c++11 -fPIC `python -m pybind11 --includes` cpp.cpp -o cpp.so `python-config --ldflags`

python:

$ python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 12:01:12) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cpp
>>> dir(cpp)
['__doc__', '__file__', '__name__', '__package__', 'cpp_method']
>>> def py_method(**kwargs):
...     print 'Printing from python, kwargs: ', kwargs
...     return 'py_method return string'
... 
>>> cpp.cpp_method(py_method, a=1, b=2, c=3)
Printing from python, kwargs:  {'a': 1, 'c': 3, 'b': 2}
Printing from cpp: py_method return string