很多时候需要给c++程序提供一种使用上的灵活性,脚本语言在这里就变得很重要了。采用Boost.Python为c++程序加一层shell,比较简单、简洁,对原有的c++代码也没有侵入性。今天试了一下,感觉不错,可以把它集成在现在正在做的项目中。
我主要参照David Abrahams的"Building Hybrid Systems with Boost.Python"(http://www.boost-consulting.com/writing/bpl.html)一文,该文中对编译 过程说的较少,偶就略做补充,为新手节省点时间(偶也是python新手)。
为c++类加python shell过程基本上如下:
(1)为c++类编写一个Boost.Python wrapper
(2)编译成so
(3)可以在python中调用了
针对David Abrahams的例子,偶的源文件如下:
例1:hello world 函数
(1)hello.cpp
#include
<
stdexcept
>
char
const
*
greet(unsigned x)
{
static
char
const
*
const
msgs[]
=
{
"
hello
"
,
"
Boost.Python
"
,
"
world!
"
};
if
(x
>
2
)
throw
std::range_error(
"
greet: index out of range
"
);
return
msgs[x];
}
(2)hello_wrap.cpp
#include
<
boost
/
python.hpp
>
using
namespace
boost::python;
char
const
*
greet(unsigned x);
BOOST_PYTHON_MODULE(hello)
{
def(
"
greet
"
, greet,
"
return one of 3 parts of a greeting
"
);
}
(3)makefile
PYTHON_INCLUDE_FLAGS
=
\
-
I
/
usr
/
include
/
python2.
4
LIB_FLAGS
=
\
-
lboost_python
SOURCE
=
\
hello.cpp hello_wrap.cpp
all:${SOURCE}
g
++
${PYTHON_INCLUDE_FLAGS} ${SOURCE} ${LIB_FLAGS}
-
shared
-
o hello.so
clean:
rm
-
f hello
*
.o
*
.
out
*
.so
(4)hello.py
import hello
for
x
in
range(
3
):
print hello.greet(x)
例2:hello world类
(1)hello_class.cpp
#include
<
boost
/
python.hpp
>
#include
<
iostream
>
using
namespace
std;
using
namespace
boost::python;
class
World
{
public
:
void
set
(std::
string
msg) {
this
->
msg
=
msg; }
void
greet()
{
cout
<<
this
->
msg
<<
endl;
}
string
msg;
};
BOOST_PYTHON_MODULE(hello)
{
class_
<
World
>
w(
"
World
"
);
w.def(
"
greet
"
,
&
World::greet);
w.def(
"
set
"
,
&
World::
set
);
};
(2)makefile
PYTHON_INCLUDE_FLAGS
=
\
-
I
/
usr
/
include
/
python2.
4
LIB_FLAGS
=
\
-
lboost_python
SOURCE
=
\
hello_class.cpp
all:${SOURCE}
g
++
${PYTHON_INCLUDE_FLAGS} ${SOURCE} ${LIB_FLAGS}
-
shared
-
o hello.so
clean:
rm
-
f hello
*
.o
*
.
out
*
.so
(3)hello_class.py
import hello
planet
=
hello.World()
planet.
set
(
'
howdy
'
)
planet.greet()
更复杂的调用见上面提到的David Abrahams的文章。
或参考:http://www.open-open.com/lib/view/open1329532323890.html