﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-奔向C++-随笔分类-C++和Python</title><link>http://www.cppblog.com/zhaoyg/category/17036.html</link><description>记录点滴，成就未来</description><language>zh-cn</language><lastBuildDate>Thu, 02 Jun 2011 03:30:03 GMT</lastBuildDate><pubDate>Thu, 02 Jun 2011 03:30:03 GMT</pubDate><ttl>60</ttl><item><title>C++中调用python函数</title><link>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 02 Jun 2011 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/147938.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/147938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/147938.html</trackback:ping><description><![CDATA[<br />以下是通过boost::python实现的，python版本2.7<br /><div>  <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">声明变量</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pFunc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;声明变量</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这里是要调用的文件名</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">pModule)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">err</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;*</span><span style="color: #000000; ">&nbsp;_module;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Module&nbsp;handle.</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;_module&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">(pModule);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过call_method</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(_module</span><span style="color: #000000; ">-&gt;</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">()&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">);&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过attr</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;main_module.attr("Hello")(2);&nbsp;展开如下</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">_module);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;FunObj&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取hello函数对象<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过object父类的operator()操作符</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;FunObj(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过call</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(FunObj.ptr(),&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;遍历一遍python内置类型list对象中的值</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;&nbsp;List&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">list</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(_module</span><span style="color: #000000; ">-&gt;</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">()&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">getList</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len(List);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;n&nbsp;;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;val&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;extract</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;(List[i]);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取List[i]产生的object对象中的值</span><span style="color: #008000; ">，通过extract模板来转换<br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;val&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div> <br /> <br /> <br /> </div><img src ="http://www.cppblog.com/zhaoyg/aggbug/147938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-06-02 11:22 <a href="http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Boost::Python实现C++对象导入python环境</title><link>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 01 Jun 2011 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/147885.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/147885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/147885.html</trackback:ping><description><![CDATA[Google了很多资料，找到的都不满意，于是摸索许久后有了些发现。<br /><br />以下只是对自己摸索结果的总结，其中难免存在错误，<span style="color: #ff0000;"><strong>如有任何错误，望不惜指正</strong></span><span></span><br /><br />类定义：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Demo<br />{<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;m_nam;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setVal(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;val)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_val&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;getVal()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;m_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setName(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nam&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;getName()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;m_nam.c_str();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;show()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />};</span></div><br /><strong>方法一：</strong><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fun1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">_module(pModule);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(_module);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;导出C++类到python中</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000;">) </span><span style="color: #008000;">// 通过boost::python中的class_</span><span style="color: #008000;">将C++类包装成object类型，因为python中所有类型都是object</span><span style="color: #008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过boost::python提供的模板函数ptr，来将Demo对象传入python</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Demo&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">(ptr(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">之前:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(pModule&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">之后:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br /><br /><div>&nbsp;&nbsp;&nbsp; <span style="color: #008000;">// 通过python函数返回C++对象</span><br />&nbsp;&nbsp; &nbsp;Demo tmp = call_method&lt;Demo&gt;(pModule , "ReturnCppClass");<br />&nbsp;&nbsp; &nbsp;std::cout &lt;&lt; tmp.getName() &lt;&lt; " " &lt;&lt; tmp.getVal() &lt;&lt;endl;</div>}</span></div><br />helloworld.py脚本内容：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fun2():<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;test;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp.setVal(</span><span style="color: #000000; ">12345</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp.setName(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">2011-5-19</span><span style="color: #800000; ">"</span><span style="color: #000000; ">);<br /><br /><div><span style="color: #0000ff;">def</span> ReturnCppClass():<br />&nbsp;&nbsp;&nbsp; tmp = Demo();<br />&nbsp;&nbsp;&nbsp; tmp.setName('<span style="color: #993300;">123456789</span>')<br />&nbsp;&nbsp;&nbsp; tmp.setVal(99);<br />&nbsp;&nbsp;&nbsp; return tmp;</div></span></div><br /><div><span style="color: #000000;">1.语句main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #0000FF; ">object</span><span style="color: #000000; ">(ptr(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000;">a)); 中的"test"是a对象在脚本中的别名，于是脚本中可以直接通过test名字操作C++对象。<br />2.Demo tmp = call_method&lt;Demo&gt;(pModule , "ReturnCppClass");来实现在python中创建C++对象，并且返回到C++中<br /><br /><strong>方法二：<br /></strong>通过智能指针实现C++对象的导入<strong><br /></strong></span></div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">typedef&nbsp;boost::shared_ptr&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;Demo&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;Demo_ptr;<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fun2()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Demo_ptr&nbsp;spD1(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Demo);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NULL</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setVal(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register_ptr_to_python&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo_ptr</span><span style="color: #000000; ">&gt;</span><span style="color: #000000;">();&nbsp; </span><span style="color: #008000;">// 注册只能指针</span><span style="color: #000000;"><br /></span><span style="color: #008000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;*</span><span style="color: #000000; ">&nbsp;_module;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_module&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">(pModule);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">_module);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;dictionary&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">__dict__</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br /></span><span style="color: #000000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">DemoObj</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000;">&nbsp;spD1; </span><span style="color: #008000;">// 添加智能指针到脚本，并重命名</span><span style="color: #000000;"><br /></span><span style="color: #008000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(pModule&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetObj</span><span style="color: #000000; ">"</span><span style="color: #000000;">); </span><span style="color: #008000;">// 在脚本中通过操纵智能指针来控制对象</span><span style="color: #000000;"><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(error_already_set)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PyErr_Print();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">spD1-&gt;getName():&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">spD1-&gt;getVal():&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">getVal()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;</span><span style="color: #000000; "><br />}</span></div><br />脚本内容：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;SetObj():<br />&nbsp;&nbsp;&nbsp;&nbsp;DemoObj.setVal(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;DemoObj.setName(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">hello</span><span style="color: #800000; ">'</span><span style="color: #000000; ">);</span></div><br />1.register_ptr_to_python &lt;Demo_ptr&gt;(); 没有这句运行时会得到错误。关于register_ptr_to_python，boost中的解释是：<br /><em>&#8220;a function template   which registers a conversion for smart pointers to Python&#8221;</em><br /><br />2.<div><span style="color: #000000; ">dictionary[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span></div>与方法一中的：<br /><div><span style="color: #000000; ">main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000; "><br /></span></div>效果一样。<br /><br />-----------------------------------------------------------------------------------<br />以上就是关于如何将C++对象传入python的一点习得，<span style="color: #ff0000;"><strong>如有任何错误，望不惜指正</strong></span><br />-----------------------------------------------------------------------------------<br /><br />P.S.: cppblog提供的编辑器不好用<img src ="http://www.cppblog.com/zhaoyg/aggbug/147885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-06-01 17:34 <a href="http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C++嵌入python脚本后的程序发布问题</title><link>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Mon, 25 Apr 2011 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/142659.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/142659.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/142659.html</trackback:ping><description><![CDATA[近来在做一个C++嵌入python的程序，刚开始一直在本机跑，一切正常，后来拿到别人机子上就无法运行了。本以为是缺少了python27.dll，结果发现不止缺少这一个文件，貌似还缺少很多python的库文件。<br /><br />于是通过关键字&#8220;C++嵌入python 发布&#8221;，找到了一个用py2exe来解决问题，但我试了半天都没成功（也许是我自己没弄对的原因，因为人家都成功了）。<br />再后来我把关键字改为了&#8220;python C++ distribute embed&#8221;（即英文关键字），这下拨云见天了，因为在Google的第一页就有一个外国帖子其标题正和我意（果然英语给力）。<br /><br />看了那个贴子发现，之所以不能在没有安装python的机子上运行是因为：<br /><br />&#8220;<br /><strong>In addition to pythonxy.dll, you also need the entire Python library, i.e. the contents of the lib folder, plus the extension modules, i.e. the contents of the DLLs folder. Without the standard library, Python won't even start, since it tries to find os.py (in 3.x; string.py in 2.x). On startup, it imports a number of modules, in particular site.py.<br /></strong>&#8221;<br /><br />原文：<a href="http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed">http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed</a><br /><img src ="http://www.cppblog.com/zhaoyg/aggbug/142659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-04-25 09:57 <a href="http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>