我有一大堆工作的C ++代码,我想编写Python绑定。我正在尝试使用Boost.Python,因为它似乎是让这个工作最简单的方法,但它不合作。这是我正在尝试构建的扩展模块的代码的一部分:
BOOST_PYTHON_MODULE(libpcap_ext) {
using namespace boost::python;
class_<PacketEngine>("PacketEngine")
.def("getAvailableDevices", &PacketEngine_getAvailableDevices);
}
Bjam似乎很痛苦并拒绝识别我的Pythonpath或允许我链接libpcap,所以我正在使用CMake。这是我的CMakeLists文件,它可以导入和构建一切就好(按预期输出libpcap.so):
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE "DEBUG")
#SET(CMAKE_BUILD_TYPE "RELEASE")
#SET(CMAKE_BUILD_TYPE "RELWITHDEBINFO")
#SET(CMAKE_BUILD_TYPE "MINSIZEREL")
ENDIF()
FIND_PACKAGE(Boost 1.55.0)
find_package(PythonLibs REQUIRED)
IF(Boost_FOUND)
INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "${PYTHON_INCLUDE_DIRS}")
SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_MULTITHREADED ON)
SET(Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE(Boost 1.55.0 COMPONENTS python)
ADD_LIBRARY(pcap_ext MODULE PacketWarrior/pcap_ext.cc PacketWarrior/PacketEngine.h PacketWarrior/PacketEngine.cc PacketWarrior/Packet.h PacketWarrior/Packet.cc)
TARGET_LINK_LIBRARIES(pcap_ext pcap)
TARGET_LINK_LIBRARIES(pcap_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
ELSEIF(NOT Boost_FOUND)
MESSAGE(FATAL_ERROR "Unable to find correct Boost version. Did you set BOOST_ROOT?")
ENDIF()
ADD_DEFINITIONS("-Wall")
我的pcap.py文件尝试使用该模块:
import libpcap_ext
engine = libpcap_ext.PacketEngine()
print engine.getAvailableDevices()
但是每当我尝试运行模块时,都会出现以下错误:
Traceback (most recent call last):
File "../pcap.py", line 2, in <module>
engine = libpcap_ext.PacketEngine()
TypeError: __init__() should return None, not 'NoneType
我假设是因为Boost.Python尝试使用Python 3而我的系统默认是Python 2.7.3。我已经尝试将我的user-config.jam文件(在我的boost_1_55_0目录中)更改为指向Python 2.7并尝试构建:
# Configure specific Python version.
# using python : 2.7 : /usr/bin/python2.7 : /usr/include/python2.7 : /usr/lib ;
当我尝试使用bjam(大量警告)构建快速启动时,Boost.Python的安装说明[0]似乎失败了,所以我尝试按照Boost入门指令[1]来构建Python头二进制文件,我认为是什么导致了这个问题。关于如何解决这个问题的任何建议都是惊人的,我已经花了好几个小时。
答案 0 :(得分:11)
此错误可能是由于链接错误的Python库。确保您的扩展以及Boost Python库与您用于导入模块的Python安装相关联。
在Linux上,您可以检查与ldd
链接的库。在OS X otool -L
做同样的事情。所以,例如
otool -L libpcap_ext.so
otool -L /path/to/libboost_python-mt.dylib
应该列出他们链接的Python库。
使用CMake,您可以使用变量PYTHON_LIBRARY
来更改使用的Python库。例如,在命令行上,您可以使用
cmake -DPYTHON_LIBRARY="/path/to/libpython2.7.dylib" source_dir
最后,在OS X上,快速而肮脏的方式(即无需重新编译)来更改动态链接的库是install_name_tool -change
。