﻿<?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++博客-to myself 的分类学习日志-随笔分类-python</title><link>http://www.cppblog.com/toMyself/category/15541.html</link><description>做自己想做的事</description><language>zh-cn</language><lastBuildDate>Tue, 04 Mar 2014 01:03:36 GMT</lastBuildDate><pubDate>Tue, 04 Mar 2014 01:03:36 GMT</pubDate><ttl>60</ttl><item><title>Python Web 开发</title><link>http://www.cppblog.com/toMyself/archive/2014/03/03/206016.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 03 Mar 2014 02:05:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2014/03/03/206016.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/206016.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2014/03/03/206016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/206016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/206016.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</p>
<ul><li>新知：</li>
<ol><li>Python框架。</li><li>Twisted：用Python实现的基于事件驱动的网络引擎框架。</li><li>Ajax浏览器编程技术。</li><li>LAMP。</li></ol></ul>
<p><br /><br /><br /></p><img src ="http://www.cppblog.com/toMyself/aggbug/206016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2014-03-03 10:05 <a href="http://www.cppblog.com/toMyself/archive/2014/03/03/206016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取.ini文件</title><link>http://www.cppblog.com/toMyself/archive/2011/02/25/140662.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 25 Feb 2011 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2011/02/25/140662.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/140662.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2011/02/25/140662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/140662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/140662.html</trackback:ping><description><![CDATA[read_ini/config/login.cfg<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">Account</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br>username</span><span style="color: #000000;">=</span><span style="color: #000000;">jason<br>password</span><span style="color: #000000;">=</span><span style="color: #000000;">123</span></div>
<br>read_ini/script/readcfg.py<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">read&nbsp;.ini</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;ConfigParser<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;getUserName():<br>&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ConfigParser.ConfigParser()<br>&nbsp;&nbsp;&nbsp;&nbsp;config.readfp(open(</span><span style="color: #800000;">'</span><span style="color: #800000;">../config/login.cfg</span><span style="color: #800000;">'</span><span style="color: #000000;">))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;userName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.get(</span><span style="color: #800000;">"</span><span style="color: #800000;">Account</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">username</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userName<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;getPassword():<br>&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ConfigParser.ConfigParser()<br>&nbsp;&nbsp;&nbsp;&nbsp;config.readfp(open(</span><span style="color: #800000;">'</span><span style="color: #800000;">../config/login.cfg</span><span style="color: #800000;">'</span><span style="color: #000000;">))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.get(</span><span style="color: #800000;">"</span><span style="color: #800000;">Account</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">password</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;password<br><br></span><span style="color: #008000;">#</span><span style="color: #008000;">print&nbsp;getUserName()</span></div>
<br>read_ini/src/pytest.cpp<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Python.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">**</span><span style="color: #000000;">&nbsp;argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br><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;">Py_IsInitialized())<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;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;PyRun_SimpleString(</span><span style="color: #000000;">"</span><span style="color: #000000;">import&nbsp;sys</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;PyRun_SimpleString(</span><span style="color: #000000;">"</span><span style="color: #000000;">sys.path.append('../script/')</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pName,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pModule,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pDict,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pFunc,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pReturn;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyString_FromString(</span><span style="color: #000000;">"</span><span style="color: #000000;">readcfg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;pModule&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyImport_Import(pName);<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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;find&nbsp;readcfg.py\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;pDict&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyModule_GetDict(pModule);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">pDict&nbsp;)<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;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;to&nbsp;call&nbsp;getUserName</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pFunc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyDict_GetItemString(pDict,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">getUserName</span><span style="color: #000000;">"</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;">pFunc&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">PyCallable_Check(pFunc))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;find&nbsp;function&nbsp;[getUserName]\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pReturn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyObject_CallObject(pFunc,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pUserName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyString_AsString(pReturn);<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;">pUserName)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;get&nbsp;userName.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">login:userName=%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pUserName);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;to&nbsp;call&nbsp;getPassword</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pFunc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyDict_GetItemString(pDict,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">getPassword</span><span style="color: #000000;">"</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;">pFunc&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">PyCallable_Check(pFunc))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;find&nbsp;function&nbsp;[getPassword]\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pReturn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyObject_CallObject(pFunc,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pPassword&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyString_AsString(pReturn);<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;">pPassword)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;get&nbsp;password.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">login:password=%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pPassword);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;Py_DECREF(pName);<br>&nbsp;&nbsp;&nbsp;&nbsp;Py_DECREF(pReturn);<br>&nbsp;&nbsp;&nbsp;&nbsp;Py_DECREF(pModule);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Py_Finalize();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}&nbsp;</span></div>
<br>遇到并解决的问题：<br>1，不要把脚本命名位test.py，test.py&nbsp; 是另外一个文件<br>import&nbsp;&nbsp; test<br>print&nbsp;&nbsp; test.__file__&nbsp;
<br><br>2，如果PyImport_Import
脚本文件失败，可能是脚本内容本身有问题，应该首先确保python readcfg.py
执行没有问题。<br><br>待解决的问题：<br>1，<br>pReturn&nbsp;=&nbsp;PyObject_CallObject(pFunc,&nbsp;NULL);
<br>int listSize = PyList_Size(pReturn);
<br>char&nbsp;*pUserName&nbsp;=&nbsp;PyString_AsString(pReturn);
<br>listSize为-1， 能够得到pUserName。<br>这样做，脚本函数只能返回一个值，与参考2不一样。<br><br><br>参考：<br>1，在调用python函数时两个API：<br>PyObject* PyObject_CallObject( PyObject *callable_object, PyObject *args)<br>已经获得了一个可以调用的python对象，比如一个函数，提供一个元组格式的参数调用，元组里面是按顺序的参数，apply(callable_object, args) 或者callable_object(*args)。<br><br>PyObject* PyObject_CallMethod( PyObject *o, char *method, char *format, ...)<br>调用一个对象里的一个函数，相当于python语法的o.method(args)，其中的格式format可以参照文档里Py_BuildValue的参数。
<br><br>2，脚本函数返回多个值：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;pArgs</span><span style="color: #000000;">=</span><span style="color: #000000;">PyTuple_New(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br><br>&nbsp;PyObject&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">reVal;<br>&nbsp;PyTuple_SetItem(pArgs,0,Py_BuildValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">s</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">e:\\v</span><span style="color: #800000;">"</span><span style="color: #000000;">));<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">函数调用<br>&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pRetVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PyEval_CallObject(pFunc,&nbsp;pArgs);<br><br>&nbsp;long&nbsp;temp1;<br>&nbsp;temp1</span><span style="color: #000000;">=</span><span style="color: #000000;">PyList_Size(pRetVal);<br><br>&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">解析返回值<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(int&nbsp;index</span><span style="color: #000000;">=</span><span style="color: #000000;">0;index</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">temp1;index</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">vSValue.<br>&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">tempPyObject</span><span style="color: #000000;">=</span><span style="color: #000000;">PyList_GetItem(pRetVal,index);<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;flag</span><span style="color: #000000;">=</span><span style="color: #000000;">PyString_Check(tempPyObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;vSValue.push_back(PyString_AsString(tempPyObject));<br>&nbsp;&nbsp;&nbsp;}&nbsp;</span></div>
<br><br><br><br><br><br><img src ="http://www.cppblog.com/toMyself/aggbug/140662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2011-02-25 17:23 <a href="http://www.cppblog.com/toMyself/archive/2011/02/25/140662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python与C或者C++的混合编程</title><link>http://www.cppblog.com/toMyself/archive/2010/11/30/135094.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 30 Nov 2010 11:10:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/11/30/135094.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/135094.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2010/11/30/135094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/135094.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/135094.html</trackback:ping><description><![CDATA[python<br>pdf book: http://www.oschina.net/bbs/thread/9780<br><br><br>python与C或者C++的混合编程： 包括在python中调用C++中的API，和在C++中调用python脚本。<br>实战构建Python和C++混合系统： http://blog.csdn.net/mythma/archive/2009/09/15/4556155.aspx<br><br><br>用Python编写运行Hello World程序： http://hi.baidu.com/rongjch/blog/item/1f548851e078cb8e8d543032.html/cmtid/5e9f7b600ef93dd18cb10d6a<br><br>C/C++中如何调用Python方法： http://bambooice.blog.hexun.com/37655834_d.html<br><br>#include "Python.h" <br><br>编译选项, 需要手动指定Python 的include 路径， 和链接接路径,<br>代码:<br><br>g++ PythonConsole.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7<br><br>C语言的编辑方法<br>gcc emu.c -L/usr/lib/python2.2/config -lpython2.2 -lpthread -lm -ldl -lutil <br><br><br>/usr/local/include/python2.7/<br>/usr/local/lib/python2.7/<br>/usr/local/share/man/man1/python2.7.1<br><br><br>
<h2 class="h2_print">C/C++中如何调用python方法</h2>
<span class="postbody"><font size="2">C++中调用Python脚本的意义就不讲了，至少你可以把它当成文本形式的动态链接库， <br><br>需要的时候还可以改一改，只要不改变接口， C++的程序一旦编译好了，再改就没那么方便了 <br><br>先看Python的代码 <br></font></span>
<table width="90%" align="center" border="0" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"><br>#test function <br><br>def add(a,b): <br><br>&nbsp; &nbsp; print "in python function add" <br><br>&nbsp; &nbsp; print "a = " + str(a) <br><br>&nbsp; &nbsp; print "b = " + str(b) <br><br>&nbsp; &nbsp; print "ret = " + str(a+b) <br><br>&nbsp; &nbsp; return <br><br><br><br>def foo(a): <br><br>&nbsp; &nbsp; print "in python function foo" <br><br>&nbsp; &nbsp; print "a = " + str(a) <br><br>&nbsp; &nbsp; print "ret = " + str(a * a) <br><br>&nbsp; &nbsp; return <br><br></td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br><br><font size="2">把上面的Python代码存为pytest.py <br><br>接下来是c++ 的代码 <br></font></span>
<table width="90%" align="center" border="0" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"><br>#include "Python.h" <br><br>int main(int argc, char** argv) <br>{ <br>&nbsp; &nbsp; // 初始化Python <br>&nbsp; &nbsp; //在使用Python系统前，必须使用Py_Initialize对其 <br>&nbsp; &nbsp; //进行初始化。它会载入Python的内建模块并添加系统路 <br>&nbsp; &nbsp; //径到模块搜索路径中。这个函数没有返回值，检查系统 <br>&nbsp; &nbsp; //是否初始化成功需要使用Py_IsInitialized。 <br><br>&nbsp; &nbsp; Py_Initialize(); <br><br>&nbsp; &nbsp; // 检查初始化是否成功 <br>&nbsp; &nbsp; if ( !Py_IsInitialized() ) <br>&nbsp; &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; return -1; <br>&nbsp; &nbsp; } <br><br>&nbsp; &nbsp; // 添加当前路径 <br>&nbsp; &nbsp; //把输入的字符串作为Python代码直接运行，返回0 <br>&nbsp; &nbsp; //表示成功，-1表示有错。大多时候错误都是因为字符串 <br>&nbsp; &nbsp; //中有语法错误。 <br>&nbsp; &nbsp; PyRun_SimpleString("import sys"); <br>&nbsp; &nbsp; PyRun_SimpleString("sys.path.append('./')"); <br>&nbsp; &nbsp; PyObject *pName,*pModule,*pDict,*pFunc,*pArgs; <br><br>&nbsp; &nbsp; // 载入名为pytest的脚本 <br>&nbsp; &nbsp; pName = PyString_FromString("pytest"); <br>&nbsp; &nbsp; pModule = PyImport_Import(pName); <br>&nbsp; &nbsp; if ( !pModule ) <br>&nbsp; &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; printf("can't find pytest.py"); <br>&nbsp; &nbsp; &nbsp; &nbsp; getchar(); <br>&nbsp; &nbsp; &nbsp; &nbsp; return -1; <br>&nbsp; &nbsp; } <br>&nbsp; &nbsp; pDict = PyModule_GetDict(pModule); <br>&nbsp; &nbsp; if ( !pDict ) <br>&nbsp; &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; return -1; <br>&nbsp; &nbsp; } <br><br>&nbsp; &nbsp; // 找出函数名为add的函数 <br>&nbsp; &nbsp; pFunc = PyDict_GetItemString(pDict, "add"); <br>&nbsp; &nbsp; if ( !pFunc || !PyCallable_Check(pFunc) ) <br>&nbsp; &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; printf("can't find function [add]"); <br>&nbsp; &nbsp; &nbsp; &nbsp; getchar(); <br>&nbsp; &nbsp; &nbsp; &nbsp; return -1; <br>&nbsp; &nbsp; } <br><br>&nbsp; &nbsp; // 参数进栈 <br>&nbsp; &nbsp; *pArgs; <br>&nbsp; &nbsp; pArgs = PyTuple_New(2); <br><br>&nbsp; &nbsp; //&nbsp; PyObject* Py_BuildValue(char *format, ...) <br>&nbsp; &nbsp; //&nbsp; 把C++的变量转换成一个Python对象。当需要从 <br>&nbsp; &nbsp; //&nbsp; C++传递变量到Python时，就会使用这个函数。此函数 <br>&nbsp; &nbsp; //&nbsp; 有点类似C的printf，但格式不同。常用的格式有 <br>&nbsp; &nbsp; //&nbsp; s 表示字符串， <br>&nbsp; &nbsp; //&nbsp; i 表示整型变量， <br>&nbsp; &nbsp; //&nbsp; f 表示浮点数， <br>&nbsp; &nbsp; //&nbsp; O 表示一个Python对象。 <br><br>&nbsp; &nbsp; PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); <br>&nbsp; &nbsp; PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4)); <br><br>&nbsp; &nbsp; // 调用Python函数 <br>&nbsp; &nbsp; PyObject_CallObject(pFunc, pArgs); <br><br>&nbsp; &nbsp; //下面这段是查找函数foo 并执行foo <br>&nbsp; &nbsp; pFunc = PyDict_GetItemString(pDict, "foo"); <br>&nbsp; &nbsp; if ( !pFunc || !PyCallable_Check(pFunc) ) <br>&nbsp; &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; printf("can't find function [foo]"); <br>&nbsp; &nbsp; &nbsp; &nbsp; getchar(); <br>&nbsp; &nbsp; &nbsp; &nbsp; return -1; <br>&nbsp; &nbsp; } <br><br>&nbsp; &nbsp; pArgs = PyTuple_New(1); <br>&nbsp; &nbsp; PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); // <br><br>&nbsp; &nbsp; PyObject_CallObject(pFunc, pArgs); <br><br><br>&nbsp; &nbsp; Py_DECREF(pName); <br>&nbsp; &nbsp; Py_DECREF(pArgs); <br>&nbsp; &nbsp; Py_DECREF(pModule); <br><br>&nbsp; &nbsp; // 关闭Python <br>&nbsp; &nbsp; Py_Finalize(); <br>&nbsp; &nbsp; return 0; <br>} <br></td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br><br><font size="2">编译选项, 需要手动指定Python 的include 路径， 和链接接路径, <br></font></span>
<table width="90%" align="center" border="0" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"><br>g++ PythonTest.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7 -lpthread -ldl -lm -lutil
            <br></td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br><font size="2">如果你的Python 版本号与我的不同，请修改为你自己的版本号</font></span><span class="postbody"><br></span>原文地址：http://coredump.blog.bokee.net/bloggermodule/blog_printEntry.do?id=909014 <br><br><br>参考：<br>1，Python 中文社区: http://python.cn/<br><br><br><br><br>/usr/local/include/python2.7/<br>/usr/local/lib/python2.7/<br>/usr/local/share/man/man1/python2.7.1<br><br><br>/usr/bin$ ls python* -l<br>lrwxrwxrwx 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 2010-10-21 16:20 python -&gt; python2.6<br>lrwxrwxrwx 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 2010-10-21 16:20 python2 -&gt; python2.6<br>-rwxr-xr-x 1 root root 2230352 2009-10-20 11:48 python2.6<br><br><br>/usr/bin$ which python<br>/usr/local/bin/python<br><br><br><br><br><br><br>import gtk ImportError: No module named gtk<br><br>/usr/lib/python2.5/site-packages<br>/usr/local/lib/python2.7/site-packages<br>/usr/local/lib/python2.6/site-packages<br><br>This directory exists so that 3rd party packages can be installed<br>here.&nbsp; Read the source for site.py for more details.<br><br>site.py<br><br><br>安装时候 ，注意把 gtk 选上 <br><br><br><br>&gt;&gt;&gt; import sys<br>&gt;&gt;&gt; print sys.path<br>['', '/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']<br><br><br>&gt;&gt;&gt; print sys.path<br>['', '/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']<br>&gt;&gt;&gt; <br><br>显示python的site-packages路径:<br>$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"<br>/usr/local/lib/python2.7/site-packages<br><br><br>Configuring additional built-in modules<br>---------------------------------------<br><br>Starting with Python 2.1, the setup.py script at the top of the source<br>distribution attempts to detect which modules can be built and<br>automatically compiles them.&nbsp; Autodetection doesn't always work, so<br>you can still customize the configuration by editing the Modules/Setup<br>file; but this should be considered a last resort.&nbsp; The rest of this<br>section only applies if you decide to edit the Modules/Setup file.<br>You also need this to enable static linking of certain modules (which<br>is needed to enable profiling on some systems).<br><br><br><br><br>手动编译安装python后，ibus不能用<br>我手动编译安装python2.6，之后ibus就不能用了。<br>出现下面这个<br><br>Traceback (most recent call last):<br>File "/usr/share/ibus/setup/main.py", line 28, in &lt;module&gt;<br>import gtk<br>ImportError: No module named gtk<br><br><br>但是之前python2.5.4一直没事的说，不会新编译了python之后，所有与之相关的软件都要重新编译吧？？<br><br>咳..　好像是的..<br>至少python的模块都要重新编译，比如pygtk什么的 <br><br><br>是的，重新编译 python，必须编译所有 python 模块。要编译 pygtk，必须编译一大堆的依赖。<br><br>所以，一般如果只是想要一个自己的 python，编译到与系统不同的目录并把python主程序改名是个方案。 <br><br>
在Linux上安装pygtk<br><br>由于项目需要，要在linux上为python 2.6.5安装pygtk包。本来以为很简单的一件事，或使用easy_install安装，或源代码编译安装，都很简单；不曾想搞了一天，愣是没有搞定，期间的麻烦，安装文件的左右依赖不胜其烦呀。<br><br>　　首先，在安装pygtk使用easy_install是行不通的。因为不只是要编译C代码，更需要检测机器状况，因此必须以进行常规源代码编译的方式进行安装，如configure、make、make install等。<br><br>　　另外，安装pygtk需要依赖于PyGObject，其又依赖于GObject-Introspection，而要安装GObject- Introspection，又必须安装GLIB，安装GLIB可能会安装升级gettext，因为旧版的gettext不能识别GLIB中的一些新方法。另外，安装这些包时还会要求版本号不能低于某某。于是，错综复杂，安装、卸载，最终还是没有成功。<br><br>　　刚刚看了一下pygtk官网，似乎在windows下也能安装。这个周末找个时间再好好研究一下，争取能安装成功pygtk。<br><br>python-gobject
<br><br>
<br>   <img src ="http://www.cppblog.com/toMyself/aggbug/135094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-11-30 19:10 <a href="http://www.cppblog.com/toMyself/archive/2010/11/30/135094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>