在C中嵌入python笔记

五月 15th, 2010 发表评论 阅读评论

使用Python C API在C中嵌入Python非常简单, 提供的API也很优雅。 在入门时可能会遇到几个问题, 作个笔记。

当然,这在网上可以找到些例子,其实这些例子都是一个样的,天下文章一大抄。还有就是有不少网友说python很慢,我就不太相信了,不知道这些同学有没有自己测试过,还是有一两个恶搞的家伙说了一下就人云亦云的三人成虎了。这个不好下结论,别人喜欢用什么自己也管不,还是按兴趣吧。

首先在配置IDE,把Python安装目录下的include,libs分别添加到工程的include,lib搜索目录当中,否则可能会出现找不到Python.h或者python25.lib的情况。

之后按照书中介绍的代码敲了一遍,编辑通过,但连接的时候却提示unresolved external symbol __imp___Py_Dealloc,这就是因为在Debug模式下编译器会寻找Python的debug版本的lib,但我们在网上下载的是release版本肯定没有了,这时可以取消debug模式,如下:
#ifdef _DEBUG
 #undef _DEBUG
 #include <Python.h>
 #define _DEBUG
#else
 #include <Python.h>
#endif

现在编译连接都OK了,但运行中如果通过PyImport_Import加载一个模块失败,就应该查查有没有把要加载的py模块文件拷到生成的exe文件同一个目录下了,如果含有语法错误之类的话也会导致加载失败,最好先自己在python命令行下尝试一下。

在调用python函数时是有好几个不同的,具体的差别还有待学习,这里就看了两个。
PyObject* PyObject_CallObject( PyObject *callable_object, PyObject *args)
已经获得了一个可以调用的python对象,比如一个函数,提供一个元组格式的参数调用,元组里面是按顺序的参数,apply(callable_object, args) 或者callable_object(*args)。

PyObject* PyObject_CallMethod( PyObject *o, char *method, char *format, ...)
调用一个对象里的一个函数,相当于python语法的o.method(args),其中的格式format可以参照文档里Py_BuildValue的参数。

分类: python学习 标签: C  笔记  (2220次阅读)

  1. 2010-05-19 at 16:43
    膜拜下,这代码看的头昏啊
    呵呵,期待更多资料分享。。。
  2. 2010-05-27 at 11:14
    把那个头嵌入进去就行了?
  3. 2010-05-27 at 21:43
    参观学习完备
  4. a
    2010-05-29 at 10:13
    Google Talk chatback badge 应该怎么设置,请联系我,谢谢
  5. hi
    2010-05-30 at 20:25
    好像有点问题
  6. 2010-06-03 at 12:58
    能教教我么?
  7. hi
    2010-06-10 at 12:58
    我下的模板留言好像有问题
  8. zan
    2010-06-14 at 21:31
    sdk是1.3.4
    python2.6.5

    我测试用helloworld,但是上传不上去。。。我是用launcher deploy

    网上查不到 set HTTP_PROXY  set HTTPS_PROXY 这个怎么设置呢?


    2010-06-14 21:03:36 Running command: &quot;['C:\\Python26\\pythonw.exe', 'C:\\Program Files\\Google\\google_appengine\\appcfg.py', '--no_cookies', u'--email=zhengzanzan@gmail.com', '--passin', 'update', u'D:\\helloworld']&quot;
    C:\Program Files\Google\google_appengine\appcfg.py:41: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
      os.path.join(DIR_PATH, 'lib', 'antlr3'),
    C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_login.py:33: DeprecationWarning: the md5 module is deprecated; use hashlib instead
      import md5
    Application: lostin502; version: 1.
    Server: appengine.google.com.
    Scanning files on local disk.
    Initiating update.
    2010-06-14 21:03:39,061 ERROR appcfg.py:1568 An unexpected error occurred. Aborting. 
    Traceback (most recent call last):
      File &quot;C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.py&quot;, line 1535, in DoUpload
        missing_files = self.Begin()
      File &quot;C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.py&quot;, line 1305, in Begin
        version=self.version, payload=self.config.ToYAML())
      File &quot;C:\Program Files\Google\google_appengine\google\appengine\tools\appengine_rpc.py&quot;, line 346, in Send
        f = self.opener.open(req)
      File &quot;C:\Python26\lib\urllib2.py&quot;, line 391, in open
        response = self._open(req, data)
      File &quot;C:\Python26\lib\urllib2.py&quot;, line 409, in _open
        '_open', req)
      File &quot;C:\Python26\lib\urllib2.py&quot;, line 369, in _call_chain
        result = func(*args)
      File &quot;C:\Program Files\Google\google_appengine\google\appengine\tools\https_wrapper.py&quot;, line 136, in https_open
        return self.do_open(http_class_wrapper, req)
      File &quot;C:\Python26\lib\urllib2.py&quot;, line 1136, in do_open
  9. 2010-07-02 at 17:16
    python最近也很流行呀,很多公司都在招聘python方面的人。
  10. 2010-07-05 at 15:12
    佩服搞技术的牛人
  11. Lovebird
    2010-07-06 at 00:06
    啊高,加把劲,争取把脚本搞到我们的游戏引擎中来哈:)
  12. 2010-07-12 at 01:43
    python越来越适用了··
  13. 2010-07-12 at 17:20
    你好,博主,非常喜欢你的文章 , 希望博主回访!!能多多交流,以后会经常来看看的!
  14. 2010-07-15 at 13:06
    很久没有更新了啊
  15. 2010-07-30 at 13:42
    学习了
  16. 2010-07-31 at 15:51
    云彩从天上飘过,我从这里踩过!
  17. 2010-08-10 at 17:32
    python的嵌入方法一直就没搞清楚,害的好多功能实现不了,我接着研究吧。
  18. 2010-08-10 at 17:34
    创新工场招聘python,有合适的人可以推荐给我。
  19. 2010-08-16 at 23:53
    老实说,不懂!
  20. 2010-09-07 at 23:54
    路过,支持一下!
  21. 2010-09-08 at 00:26
    头大
  22. 2010-09-22 at 17:37
    头疼啊这个问题
  23. 2010-09-29 at 10:59
    曾接触过简单的代码,学习了
  24. 2010-12-01 at 16:12
    谢谢分享了。。很有用
  25. 2011-03-30 at 21:08
    学习了.