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

來源:互聯網
上載者:User
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 2008, 21: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的介面封裝得更為友好而已如異常處理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.