现在的位置: 首页 > 综合 > 正文

boost.python和python-dev的ubuntu 8.10下的安装,版本以及注意事项(7)

2013年09月08日 ⁄ 综合 ⁄ 共 3735字 ⁄ 字号 评论关闭
python和c++互操作前面我介绍了一些例子。
系列文章:
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)
c++调用PythonAPI线程状态和全局解释期锁(6)

因为很容易出问题,比如Unicode的问题,ImportError的问题。所以,把安装和配置介绍一下。

1.python-dev安装

http://www.python.org/
下载2.5.1/2.5.2/2.6.1/都可以,3.0没试过。
需要tk-dev,tcl-dev,zlib

解压
$./configure --prefix=/home/lhb/local2.5.1 --enable-unicode=ucs4 --enable-shared
enable-unicode:ucs2或者ucs4,linux下一般都是ucs4
enable-shared:编译出共享库。
$make
$make install
安装完毕之后,检查是否支持ucs4,很多人出现PyUnicode的错误,就是因为python没有支持ucs4

  1. $ LD_LIBRARY_PATH=/home/lhb/local2.5.1/lib /home/lhb/local2.5.1/bin/python
  2. Python 2.5.1 (r251:54863, Dec  8 200821:22:27)
  3. [GCC 4.3.2] on linux2
  4. Type "help""copyright""credits" or "license" for more information.
  5. >>> import sys
  6. >>> sys.maxunicode
  7. 1114111
  8. >>>

如果显示是1114111,则是ucs4。
python unicode的文章,可以参考这里

注意:如果使用新安装的python,则需要修改环境变量,如 export PYTHONHOME=/home/lhb/local2.5.1/,否则会出现诸如ImportError: /usr/lib/python2.5/lib-dynload/math.so: undefined symbol: PyFPE_jbuf的问题,这个问题的原因就是因为你的python的两个路径不一致导致的。

2.boost.python的安装
可能需要三个包
zlib
http://www.zlib.net/
http://www.zlib.net/zlib-1.2.3.tar.gz
注意,编译共享库 ./configure --shared

bzlib
http://www.bzip.org/
http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz

libicu
http://www.icu-project.org/download/

boost可以下1_35,1_17版本
http://www.boost.org/

解压
配置
$./configure --prefix=/home/lhb/local --with-icu --with-libraries=python
with-libraries=python是只编译python,编译所有的时间很恐怖的!
$make
$make install

3.例子

  1. #include <Python.h>
  2. #include <boost/python.hpp>
  3. using namespace boost::python;
  4. char const* greet()
  5. {
  6.    return "hello, world";
  7. }
  8. BOOST_PYTHON_MODULE(hello)
  9. {
  10.    def("greet", greet);
  11. }
  12. int run1()
  13. {
  14.     Py_Initialize();
  15.     inithello();
  16.     PyRun_SimpleString("import sys");
  17.     PyRun_SimpleString("print sys.version");
  18.     PyRun_SimpleString("print sys.path");
  19.     PyRun_SimpleString("from time import time, ctime");
  20.     PyRun_SimpleString("print 'Today is', ctime(time())");
  21.     PyRun_SimpleString("import hello");
  22.     PyRun_SimpleString("print hello.greet()");
  23.     Py_Finalize();
  24.     return 0;
  25. }
  26. int run2()
  27. {
  28.     Py_Initialize();
  29.     try
  30.     {
  31.         inithello();
  32.     const char* cmd = "import sys/n"/
  33.                 "print sys.version/n"/
  34.             "sys.path.append('/home/lhb/local2.5.1/lib/python2.5')/n"/
  35.                 "print sys.path/n"/
  36.             "import mytest/n"/
  37.             "mytest.testImport()/n"/
  38.                     "from time import time, ctime/n"/
  39.                 "print 'Today is', ctime(time())/n"/
  40.                 "import hello/n"/
  41.                         "print hello.greet()";
  42.      // Retrieve the main module
  43.      object main = import("__main__");
  44.      // Retrieve the main module's namespace
  45.      object global(main.attr("__dict__"));
  46.      // Define the derived class in Python.
  47.      object result = exec(cmd,global,global);
  48.     }
  49.     catch(error_already_set)
  50.     {
  51.       PyErr_Print();
  52.     }
  53.     Py_Finalize();
  54.     return 0;
  55. }
  56. int main()
  57. {
  58.     run1()
  59.     run2()
  60. }

编译:

  1. #!/bin/bash
  2. boosthead='/home/lhb/local/include/boost-1_37'
  3. boostlib='/home/lhb/local/lib'
  4. pythonhead='/home/lhb/local2.5.1/include/python2.5'
  5. pythonlib='/home/lhb/local2.5.1/lib'
  6. g++ -o seraph251 seraph.cpp -L${pythonlib} -lpython2.5 -L${boostlib} -lboost_python-mt -I${pythonhead} -I${boosthead} -DARCH32 
  7. #-Xlinker -export-dynamic
  8. LD_LIBRARY_PATH=${boostlib}:${pythonlib} ldd seraph251
  9. LD_LIBRARY_PATH=${boostlib}:${pythonlib} ./seraph251

注意:这个选项-Xlinker -export-dynamic,前面配置python的时候enable-shared这个选项,如果没有写,则不会编译出动态库,只有静态库。此时,你写的例子编译时就需要加上-Xlinker -export-dynamic,这个选项,否则,执行时就会出类似下面的问题:ImportError: /usr/lib/python2.5/lib-dynload/time.so: undefined symbol: PyModule_AddObject

注意:很多时候,很多人搞不清楚,python和python-dev以及boost.python的关系。python是执行环境,如果你要c/c++中调用python,或者python调用c或者c++,则需要python-dev。boost.python仅仅是对python-dev进行了封装,很多函数,两边都具有同样的功能,也就是说用python-dev中的也可以如run1函数,用boost.python中的也行如run2,boost.python的接口封装得更为友好而已如异常处理。

抱歉!评论已关闭.