python c/c++ 混合編程

來源:互聯網
上載者:User

 

pythonpdf book: http://www.oschina.net/bbs/thread/9780python與C或者C++的混合編程: 包括在python中調用C++中的API,和在C++中調用python指令碼。實戰構建Python和C++混合系統: http://blog.csdn.net/mythma/archive/2009/09/15/4556155.aspx用Python編寫運行Hello World程式: http://hi.baidu.com/rongjch/blog/item/1f548851e078cb8e8d543032.html/cmtid/5e9f7b600ef93dd18cb10d6aC/C++中如何調用Python方法: http://bambooice.blog.hexun.com/37655834_d.html#include "Python.h" 編譯選項, 需要手動指定Python 的include 路徑, 和連結接路徑,代碼:g++ PythonConsole.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7C語言的編輯方法gcc emu.c -L/usr/lib/python2.2/config -lpython2.2 -lpthread -lm -ldl -lutil /usr/local/include/python2.7//usr/local/lib/python2.7//usr/local/share/man/man1/python2.7.1C/C++中如何調用python方法C++中調用Python指令碼的意義就不講了,至少你可以把它當成文本形式的動態連結程式庫, 需要的時候還可以改一改,只要不改變介面, C++的程式一旦編譯好了,再改就沒那麼方便了 先看Python的代碼 代碼: #test function def add(a,b):     print "in python function add"     print "a = " + str(a)     print "b = " + str(b)     print "ret = " + str(a+b)     return def foo(a):     print "in python function foo"     print "a = " + str(a)     print "ret = " + str(a * a)     return  把上面的Python代碼存為pytest.py 接下來是c++ 的代碼 代碼: #include "Python.h" int main(int argc, char** argv) {     // 初始化Python     //在使用Python系統前,必須使用Py_Initialize對其     //進行初始化。它會載入Python的內建模組並添加系統路     //徑到模組搜尋路徑中。這個函數沒有傳回值,檢查系統     //是否初始化成功需要使用Py_IsInitialized。     Py_Initialize();     // 檢查初始化是否成功     if ( !Py_IsInitialized() )     {         return -1;     }     // 添加當前路徑     //把輸入的字串作為Python代碼直接運行,返回0     //表示成功,-1表示有錯。大多時候錯誤都是因為字串     //中有語法錯誤。     PyRun_SimpleString("import sys");     PyRun_SimpleString("sys.path.append('./')");     PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;     // 載入名為pytest的指令碼     pName = PyString_FromString("pytest");     pModule = PyImport_Import(pName);     if ( !pModule )     {         printf("can't find pytest.py");         getchar();         return -1;     }     pDict = PyModule_GetDict(pModule);     if ( !pDict )     {         return -1;     }     // 找出函數名為add的函數     pFunc = PyDict_GetItemString(pDict, "add");     if ( !pFunc || !PyCallable_Check(pFunc) )     {         printf("can't find function [add]");         getchar();         return -1;     }     // 參數進棧     *pArgs;     pArgs = PyTuple_New(2);     //  PyObject* Py_BuildValue(char *format, ...)     //  把C++的變數轉換成一個Python對象。當需要從     //  C++傳遞變數到Python時,就會使用這個函數。此函數     //  有點類似C的printf,但格式不同。常用的格式有     //  s 表示字串,     //  i 表示整型變數,     //  f 表示浮點數,     //  O 表示一個Python對象。     PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));     PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));     // 調用Python函數     PyObject_CallObject(pFunc, pArgs);     //下面這段是尋找函數foo 並執行foo     pFunc = PyDict_GetItemString(pDict, "foo");     if ( !pFunc || !PyCallable_Check(pFunc) )     {         printf("can't find function [foo]");         getchar();         return -1;     }     pArgs = PyTuple_New(1);     PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); //     PyObject_CallObject(pFunc, pArgs);     Py_DECREF(pName);     Py_DECREF(pArgs);     Py_DECREF(pModule);     // 關閉Python     Py_Finalize();     return 0; }  編譯選項, 需要手動指定Python 的include 路徑, 和連結接路徑, 代碼: g++ PythonTest.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil  如果你的Python 版本號碼與我的不同,請修改為你自己的版本號碼原文地址:http://coredump.blog.bokee.net/bloggermodule/blog_printEntry.do?id=909014 參考:1,Python 中文社區: http://python.cn//usr/local/include/python2.7//usr/local/lib/python2.7//usr/local/share/man/man1/python2.7.1/usr/bin$ ls python* -llrwxrwxrwx 1 root root       9 2010-10-21 16:20 python -> python2.6lrwxrwxrwx 1 root root       9 2010-10-21 16:20 python2 -> python2.6-rwxr-xr-x 1 root root 2230352 2009-10-20 11:48 python2.6/usr/bin$ which python/usr/local/bin/pythonimport gtk ImportError: No module named gtk/usr/lib/python2.5/site-packages/usr/local/lib/python2.7/site-packages/usr/local/lib/python2.6/site-packagesThis directory exists so that 3rd party packages can be installedhere.  Read the source for site.py for more details.site.py安裝時候 ,注意把 gtk 選上 >>> import sys>>> print sys.path['', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-linux2', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages']>>> print sys.path['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/local/lib/python2.6/dist-packages']>>> 顯示python的site-packages路徑:$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"/usr/local/lib/python2.7/site-packagesConfiguring additional built-in modules---------------------------------------Starting with Python 2.1, the setup.py script at the top of the sourcedistribution attempts to detect which modules can be built andautomatically compiles them.  Autodetection doesn't always work, soyou can still customize the configuration by editing the Modules/Setupfile; but this should be considered a last resort.  The rest of thissection only applies if you decide to edit the Modules/Setup file.You also need this to enable static linking of certain modules (whichis needed to enable profiling on some systems).手動編譯安裝python後,ibus不能用我手動編譯安裝python2.6,之後ibus就不能用了。出現下面這個Traceback (most recent call last):File "/usr/share/ibus/setup/main.py", line 28, in <module>import gtkImportError: No module named gtk但是之前python2.5.4一直沒事的說,不會新編譯了python之後,所有與之相關的軟體都要重新編譯吧??咳.. 好像是的..至少python的模組都要重新編譯,比如pygtk什麼的 是的,重新編譯 python,必須編譯所有 python 模組。要編譯 pygtk,必須編譯一大堆的依賴。所以,一般如果只是想要一個自己的 python,編譯到與系統不同的目錄並把python主程式改名是個方案。 在Linux上安裝pygtk由於項目需要,要在linux上為python 2.6.5安裝pygtk包。本來以為很簡單的一件事,或使用easy_install安裝,或原始碼編譯安裝,都很簡單;不曾想搞了一天,愣是沒有搞定,期間的麻煩,安裝檔案的左右依賴不勝其煩呀。  首先,在安裝pygtk使用easy_install是行不通的。因為不只是要編譯C代碼,更需要檢測機器狀況,因此必須以進行常規原始碼編譯的方式進行安裝,如configure、make、make install等。  另外,安裝pygtk需要依賴於PyGObject,其又依賴於GObject-Introspection,而要安裝GObject- Introspection,又必須安裝GLIB,安裝GLIB可能會安裝升級gettext,因為舊版的gettext不能識別GLIB中的一些新方法。另外,安裝這些包時還會要求版本號碼不能低於某某。於是,錯綜複雜,安裝、卸載,最終還是沒有成功。  剛剛看了一下pygtk官網,似乎在windows下也能安裝。這個周末找個時間再好好研究一下,爭取能安裝成功pygtk。python-gobject 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.