• <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>

            力為的技術(shù)博客

            聯(lián)系 聚合 管理
              154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

             一、問題:

            現(xiàn)在有一個C++類庫Mythma.dll,需要Python用戶也可以調(diào)用這些服務(wù),所以需要用封裝其為Python擴展模塊Mythma.pyd。
            現(xiàn)在有可執(zhí)行程序PythonConsole.exe,依賴Mythma.dll模塊,希望PythonConsole.exe可以調(diào)用Python腳本,所以PythonConsole.exe中需要嵌入Python解析器。

            此時,PythonConsole.exe既可以直接訪問Mythma.dll,又可以通過Python腳本訪問Mythma.dll。關(guān)系圖如下:


            二、實現(xiàn)
            1、假設(shè)Mythma.dll中的類為CHelloWorld

             

            class MythmaAPI CHelloWorld
            {
            public
            :
               CHelloWorld(
            void
            );
               
            ~CHelloWorld(void
            );

               
            void SetId(int nId) { m_Id = nId;}

               
            int  GetId() const return m_Id; }

            private:
               
            int
             m_Id;
            }
            ;

             

            2、用Boost.Python將C++模塊封裝,使得Python腳本可以調(diào)用C++的功能

                如:

            #include "HelloWorld.h"
            #include 
            <boost/python.hpp>
            using namespace boost::python;

            BOOST_PYTHON_MODULE(MythmaPy)
            {
               class_
            <CHelloWorld>("CHelloWorld")
                  .def(
            "SetId"&CHelloWorld::SetId)
                  .def(
            "GetId"&CHelloWorld::GetId)
                  ;
            }

            此時,可以用Python腳本訪問Mythma.dll中的類,axxscript.py文件中的內(nèi)容為:

            #import MythmaPy
            from MythmaPy import *
            world 
            = CHelloWorld()
            world.SetId(
            100)
            print world.GetId()


             

            3、在C++程序里內(nèi)嵌Python解析器,使得C++可以調(diào)用Python腳本

            建立一個控制臺程序PythonConsole.exe,用來嵌入Python解析器

            int main(int argc, char **argv)
            {
               
            // Initialize the interpreter
               Py_Initialize();

               
            if (python::handle_exception(exec_mythma))
               
            {
                  
            if (PyErr_Occurred())
                  
            {
                     BOOST_ERROR(
            "Python Error detected");
                     PyErr_Print();
                  }

                  
            else
                  
            {
                     BOOST_ERROR(
            "A C++ exception was thrown  for which "
                        
            "there was no exception translator registered.");
                  }

               }


               
            char ch;
               std::cin 
            >> ch;
               
            // Boost.Python doesn't support Py_Finalize yet, so don't call it!
               return boost::report_errors();
            }


            執(zhí)行調(diào)用Python腳本的過程如下:

            void exec_mythma()
            {
               std::cout 
            << "exec extension module Mythma" << std::endl;

               python::dict global;
               python::
            object result = python::exec_file(
                  
            ".\\axxscript.py", global, global);


               python::
            object world = global["world"];
               CHelloWorld
            & py = python::extract<CHelloWorld&>(world) BOOST_EXTRACT_WORKAROUND;

               std::cout 
            << py.GetId() << std::endl;

               std::cout 
            << "success!" << std::endl;
            }


            三、癥狀


            通過執(zhí)行PythonConsole.exe無法正常調(diào)用腳本,錯誤信息如下:


            假如直接運行腳本,結(jié)果正確。不知各位朋友發(fā)現(xiàn)問題的原因沒有?有什么解決方法?


            四、測試環(huán)境
            VS2008
            Python2.5
            Boost 1.38
            測試工程下載


            五:更新
            終于找到問題的原因,詳見這里
            posted on 2009-09-13 16:16 力為 閱讀(7194) 評論(2)  編輯 收藏 引用 所屬分類: 5. GP&STL&BOOSTTools

            評論

            # re: Boost.Python與C++互操作的問題(更新) 2010-06-09 18:10 iamonkey
            我正在用pyactivemq連接activemq,代碼如下:

            message = session.createMapMessage()
            message.setBytes('aaa', 'bbb')

            pydev 報出如下錯誤,好像是類型不對,就是說最后一個參數(shù)'bbb',不是std::vector<unsigned char類型,這種類型只有C語言有,我該如何處理?懇請各位大俠幫忙。

            MapMessage.setBytes(MapMessage, str, str)
            did not match C++ signature:
            setBytes(class cms::MapMessage {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >, class std::vector<unsigned char,class std::allocator<unsigned char> >)
              回復(fù)  更多評論
              

            # re: Boost.Python與C++互操作的問題(更新)[未登錄] 2010-06-11 11:08 力為
            @iamonkey
            用個Python的數(shù)組試一下吧。
            'bbb'估計按照string來處理了  回復(fù)  更多評論
              

            麻豆AV一区二区三区久久| 久久精品中文字幕无码绿巨人| 亚洲欧洲精品成人久久奇米网| 久久久久亚洲精品无码蜜桃| 久久婷婷五月综合97色直播| 少妇被又大又粗又爽毛片久久黑人 | 综合网日日天干夜夜久久| 天天做夜夜做久久做狠狠| 日韩亚洲国产综合久久久| 伊人色综合九久久天天蜜桃| 久久一本综合| 精品多毛少妇人妻AV免费久久 | 亚洲国产精品久久| 久久国产精品无码网站| 亚洲国产小视频精品久久久三级| 2019久久久高清456| 蜜臀久久99精品久久久久久小说 | 一本一本久久a久久综合精品蜜桃| 亚洲人成网站999久久久综合 | 久久人人爽人人人人片av| 色婷婷久久综合中文久久蜜桃av| 无码人妻久久久一区二区三区| 亚洲精品国精品久久99热一| 99久久久精品| 欧美麻豆久久久久久中文| 亚洲伊人久久精品影院| 久久精品国产99国产精偷| 欧美与黑人午夜性猛交久久久 | 日日躁夜夜躁狠狠久久AV| 国产成人精品久久二区二区| 国产一区二区精品久久岳| 2021国产精品午夜久久| 国产欧美一区二区久久| 欧美精品丝袜久久久中文字幕 | 国产精品一区二区久久精品无码| 日本高清无卡码一区二区久久| 亚洲AV日韩精品久久久久久 | 国产成人久久精品二区三区| 综合久久精品色| 国产精品va久久久久久久| 无码久久精品国产亚洲Av影片 |