• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Kisser Leon

            這個(gè)kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            python與c++交互學(xué)習(xí)入門(mén)之5

            Posted on 2007-06-06 16:25 kk 閱讀(5561) 評(píng)論(7)  編輯 收藏 引用 所屬分類: C++

            這次講講,如何擴(kuò)展c++庫(kù)。通過(guò)boost.python把c++庫(kù)編譯成python能夠調(diào)用的dll。


            通過(guò)上一次的教程后,大家都應(yīng)該會(huì)使用boost.python了。把c++程序編譯成pyd文件。由于c++有很多特性,所以,如果你的程

            序用了很多的c++特性的話,那么你必須做很多工作了。像虛擬函數(shù),函數(shù)重載,繼承,默認(rèn)值等等。具體如何轉(zhuǎn)化,請(qǐng)參

            boost.python的文檔了。


            這幾天嘗試著把c++程序庫(kù)編譯成python可調(diào)用的dll,不知道為什么一直不可用。。很是郁悶。老是顯示如下的錯(cuò)誤:

            Traceback (most recent call last):
              File "<pyshell#3>", line 1, in <module>
                import pydll
            ImportError: No module named pydll

            意思是說(shuō)找不到dll。我把dll都copy到python/dlls下了還是不行,而且我確定python的sys.path包含了python/dlls目錄了。

            很是不解。網(wǎng)上也很難找到資料,google了很長(zhǎng)時(shí)間找不到有用的資料,好像中文方面的資料很少的。今天嘗試了一下google

            英文資料,終于有了新的發(fā)現(xiàn):
            http://mail.python.org/pipermail/c++-sig/2007-February/011971.html
            You are using Python2.5. In this version of Python you have to have
            file extension
            to be "pyd" - sge.pyd

            --
            Roman Yakovenko
            C++ Python language binding
            http://www.language-binding.net/

            有人碰到的問(wèn)題跟我的是一樣的。后面那個(gè)Roman回答了一下,是文件擴(kuò)展名的問(wèn)題?。?!為什么不支持dll呢?不解?;厝ピ?/p>

            了一下把后綴名改了就成功了。。。why???


            下面來(lái)看一下我的那個(gè)簡(jiǎn)單的例子:
            這個(gè)例子來(lái)自于網(wǎng)上,
            http://www.vckbase.com/document/viewdoc/?id=1540
            C++ 擴(kuò)展和嵌入 Python
            作者:胡金山
            源碼下載地址:http://www.vckbase.com/code/downcode.asp?id=2777


            這是一個(gè)非常簡(jiǎn)單的dll工程。給python提供了一個(gè)函數(shù)static PyObject* Recognise(PyObject *self, PyObject *args)。


            1、不使用boost.python庫(kù)來(lái)直接構(gòu)建dll
            接下來(lái),我們來(lái)用C++為Python編寫(xiě)擴(kuò)展模塊(動(dòng)態(tài)鏈接庫(kù)),并在Python程序中調(diào)用C++開(kāi)發(fā)的擴(kuò)展功能函數(shù)。生成一個(gè)取名為

            pyUtil的Win32 DLL工程,除了pyUtil.cpp文件以外,從工程中移除所有其它文件,并填入如下的代碼:

            // pyUtil.cpp
            #ifdef PYUTIL_EXPORTS
            #define PYUTIL_API __declspec(dllexport)
            #else
            #define PYUTIL_API __declspec(dllimport)
            #endif

            #include<windows.h>
            #include<string>
            #include<Python.h>
            BOOL APIENTRY DllMain( HANDLE hModule,
                                   DWORD  ul_reason_for_call,
                                   LPVOID lpReserved
                    )
            {
                switch (ul_reason_for_call)
                {
                case DLL_PROCESS_ATTACH:
                case DLL_THREAD_ATTACH:
                case DLL_THREAD_DETACH:
                case DLL_PROCESS_DETACH:
                    break;
                }
                return TRUE;
            }
            std::string Recognise_Img(const std::string url)
            {
                //返回結(jié)果
                return "從dll中返回的數(shù)據(jù)... : " +url;
            }
            static PyObject* Recognise(PyObject *self, PyObject *args)
            {
                const char *url;
                std::string sts;
                if (!PyArg_ParseTuple(args, "s", &url))
                    return NULL;
                sts = Recognise_Img(url);
                return Py_BuildValue("s", sts.c_str() );
            }
            static PyMethodDef AllMyMethods[] = {
                {"Recognise",  Recognise, METH_VARARGS},//暴露給Python的函數(shù)
                {NULL,      NULL}        /* Sentinel */
            };
            extern "C" PYUTIL_API void initpyUtil()
            {
                PyObject *m, *d;
                m = Py_InitModule("pyUtil", AllMyMethods); //初始化本模塊,并暴露函數(shù)
                d = PyModule_GetDict(m);
            }

            在Python代碼中調(diào)用這個(gè)動(dòng)態(tài)鏈接庫(kù): (記得把dll的擴(kuò)展名改為.pyd,另外dll的路徑要能夠被檢索到)
            import pyUtil
            result = pyUtil.Recognise("input url of specific data")
            print "the result is: "+ result

             

            2、使用boost.python庫(kù)來(lái)構(gòu)建dll
            用C++為Python寫(xiě)擴(kuò)展時(shí),如果您愿意使用Boost.Python庫(kù)的話,開(kāi)發(fā)過(guò)程會(huì)變得更開(kāi)心J,要編寫(xiě)一個(gè)與上述pyUtil同樣功能

            的動(dòng)態(tài)鏈接庫(kù),只需把文件內(nèi)容替換為下面的代碼。當(dāng)然,編譯需要boost_python.lib支持,運(yùn)行需要boost_python.dll支持

            。
            #include<string>
            #include <boost/python.hpp>
            using namespace boost::python;
            #pragma comment(lib, "boost_python.lib")
            std::string strtmp;
            char const* Recognise(const char* url)
            {
                strtmp ="從dll中返回的數(shù)據(jù)... : ";
                strtmp+=url;
                return strtmp.c_str();
            }
            BOOST_PYTHON_MODULE(pyUtil)
            {
                def("Recognise", Recognise);
            }

            可以非常明顯地看到,用了boost.python庫(kù)之后,簡(jiǎn)單了很多。因?yàn)閎oost.python為你做了很多的事情。。恩。

             

            好像沒(méi)有講很多有用的東西,光顧著講了,呵呵。。。我也還在繼續(xù)學(xué)習(xí)之中。下次寫(xiě)點(diǎn)什么呢?繼續(xù)學(xué)習(xí)了哦

             

            Feedback

            # re: python與c++交互學(xué)習(xí)入門(mén)之5  回復(fù)  更多評(píng)論   

            2007-06-26 21:10 by xiaohui
            天哪,我也是遇到那個(gè)找不到dll的問(wèn)題,折騰了半天!太感謝你了

            # re: python與c++交互學(xué)習(xí)入門(mén)之5  回復(fù)  更多評(píng)論   

            2007-07-12 16:47 by barry
            是啊 ,我也遇到同樣的問(wèn)題,太謝謝你了

            # re: python與c++交互學(xué)習(xí)入門(mén)之5[未登錄](méi)  回復(fù)  更多評(píng)論   

            2008-06-05 11:14 by QQ
            就在我快要抓狂的時(shí)候看到了你的帖子,太謝謝了,哈哈
            我會(huì)一直關(guān)注的。
            努力哦。

            # re: python與c++交互學(xué)習(xí)入門(mén)之5  回復(fù)  更多評(píng)論   

            2008-10-06 00:24 by someone
            同遇到這個(gè)問(wèn)題,感謝!

            # re: python與c++交互學(xué)習(xí)入門(mén)之5  回復(fù)  更多評(píng)論   

            2012-10-10 10:36 by 金剛
            作者還在不????

            # re: python與c++交互學(xué)習(xí)入門(mén)之5  回復(fù)  更多評(píng)論   

            2012-12-15 03:24 by 畢達(dá)哥拉斯半圓
            正在學(xué)習(xí)中,mark一下
            综合网日日天干夜夜久久| 久久精品人妻中文系列| 精品午夜久久福利大片| 欧美久久精品一级c片片| 亚洲欧美日韩久久精品| 久久久久成人精品无码中文字幕 | 伊人久久大香线蕉av不变影院| 色综合久久综合中文综合网| 国产精品久久久天天影视香蕉 | 一本综合久久国产二区| 精品无码久久久久国产| 亚洲国产精品无码久久久久久曰| 久久99国产综合精品女同| 亚洲精品tv久久久久久久久久| 久久亚洲国产欧洲精品一| 色婷婷综合久久久久中文| 久久精品无码专区免费| 日本久久久久久中文字幕| 久久99国内精品自在现线| 无码超乳爆乳中文字幕久久| 亚洲欧洲精品成人久久曰影片| 国产毛片久久久久久国产毛片| 久久久久久久综合日本亚洲| 久久久精品国产sm调教网站 | 91精品免费久久久久久久久| 人妻丰满AV无码久久不卡| 伊人久久大香线蕉综合Av| 午夜天堂精品久久久久| 蜜臀久久99精品久久久久久小说| 久久久久久久久久久久久久| 国产精品99久久久精品无码| 国産精品久久久久久久| 国产精品久久久久乳精品爆| 久久播电影网| 久久精品国产99久久久香蕉| 久久精品国产WWW456C0M| 欧美粉嫩小泬久久久久久久| 久久亚洲sm情趣捆绑调教| 久久久噜噜噜久久中文福利| 国产精品久久国产精麻豆99网站| 国产精品美女久久久久网|