3

我已经设法编译了一个 Boost.Python 的“第一次尝试”,但我不确定如何将它导入 python 并调用它包含的方法。我的源文件如下:

#include <stdlib.h>
#include <string>
#include <boost/python.hpp>

using namespace boost::python;

int test(int i)
{
       fprintf(stderr, "%s:\n", __FUNCTION__);
       return i * 5;
}

BOOST_PYTHON_MODULE(ipg)
{
       using namespace boost::python;
       def("test", test);
}

我的makefile包含:

# Which compiler?
CC=c++

# Which flags for object files?
OFLAGS=-c -Wall -fPIC

# Which flags for the output binary?
BFLAGS=-Wall -shared -o ipg

# Which flags for boost python?
BPFLAGS=-I/usr/include/python2.7
BLIBS=-lpython2.7 -lboost_python -lboost_system

# Make.
all: source/python.cpp
    $(CC) $(BOUT) $(BFLAGS) $(BPFLAGS) $? $(BLIBS)

和我的测试脚本:

import sys

# My modules.
import ipg

ipg.test()

输出二进制文件放在测试脚本旁边,然后运行测试脚本。这会导致以下错误:

Traceback(最近一次调用最后一次):文件“test.py”,第 4 行,在 import ipg ImportError: No module named ipg

我应该使用什么标志来编译我的输出二进制文件,我应该如何将它导入 python?我以前在 Windows 上使用过 boost.Python,但那是很久以前的事了。

4

1 回答 1

6

在 Linux 上,如果您的模块被调用ipg,那么您需要创建一个名为ipg.so. 这是一个简单的makefile;

ipg.o:
    g++ -o ipg.o -c ipg.cc -Wall -fPIC -I/usr/include/python2.7
ipg.so: ipg.o
    g++ -shared -o ipg.so ipg.o -lpython2.7 -lboost_python -lboost_system
于 2012-12-13T22:14:39.793 回答