今天在开例会的时候,提到其他小组要做一个通用任务系统,会涉及到C++调用其他语言脚本开发的逻辑。之前倒是听互娱那边的同事说过,他们都是嵌入lua来进行脚本编程,但自己从来没试过。
而作为一个严重中毒的vim+python爱好者,其实我每天都在用vim直接执行python命令(如出名的pyflakes插件),想知道vim是怎么实现的,所以就自己试了一下。
由于家里没有linux开发环境,所以就在windows下用 Mingw + makefile的方式开发了。
先写一个简单的py程序:helloworld.py

然后来写我们的c++代码:py.cpp

然后是makefile:

执行结果如下:

目前只是简单研究了一下,等到以后需要用到的时候再深入吧。
代码路径:http://code.google.com/p/vimercode/source/browse/#svn/trunk/cpppy
另网上有几篇比较详细的文章,有兴趣的朋友可以看一下。
C++调用Python(3)
C++调用Python(4)
——————————————————————-
linux下的makefile如下:

此程序在linux下运行会core,可以尝试看一下这篇文章:
http://blog.csdn.net/marising/archive/2008/09/12/2917892.aspx

最近的一些技术整理(20120109)

前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做) 这篇还是一些技术的整理,...

阅读全文

C++模板的几个应用

C++的模板其实是个挺纠结的东西,用的不好的话,编译的一堆错误够你调到崩溃,但要是用的好呢,又确实非常方便,我们来看看 一.获取数组长度 比如 ...

阅读全文

又见C++诡异问题

用C++越久,越是觉得C++太多陷阱,真是防不胜防。 我们看这样一段代码: C++ #include <stdio.h> using namespace std; ...

阅读全文

23则回应给“C,C++代码中调用python脚本”

  1. iCyOMiK说道:

    谢,收下了。

    [回复]

  2. iCyOMiK说道:

    Segmentation fault
    怎么搞?我只是Makefile里面的:
    INC = -I/usr/include/python2.6/
    LIB = -L/usr/lib/python2.6/ -lpython2.6
    和你不同而已,不明白怎么是段错误。。。

    [回复]

    Dante 回复:

    gdb调试一下,看一下core在哪里~~

    [回复]

    iCyOMiK 回复:

    Program received signal SIGSEGV, Segmentation fault.
    0x001a2100 in PyObject_GetAttrString () from /usr/lib/libpython2.6.so.1.0

    [回复]

    Dante 回复:

    奇怪了。。我这里没报错。。你检查看是不是细节上出问题了?

    [回复]

    iCyOMiK 回复:

    我除了Makefile是复制你的,其它两个文件都是手打的,都不明白怎么会这样呢。。。难道是
    INC = -I/usr/include/python2.6/
    LIB = -L/usr/lib/python2.6/ -lpython2.6
    的问题么???

    [回复]

    Dante 回复:

    额,你的makefile应该是没问题的~
    有没有试过直接用我的代码呢?

    [回复]

    iCyOMiK 回复:

    嗯,当然,是因为直接复制你的代码make后出现上面我说情况,所以我才手打一次的,我用下面的方法make的:
    ~/project-tmp/cpp+py $ make
    g++ -c -o py.o -I /usr/include/python2.6/ -g -Wall py.cpp
    g++ -o py py.o -L /usr/lib/python2.6/ -l python2.6 -g -Wall

    ~/project-tmp/cpp+py $ ./py
    Segmentation fault

    [回复]

    lihex 回复:

    我的同样是段错误:

    lihex@lihex-laptop:/tmp$ make
    g++ -c -o py.o -I/usr/include/python2.6/ -g -Wall py.cpp
    g++ -o py py.o -L/usr/lib/ -lpython2.6 -g -Wall
    lihex@lihex-laptop:/tmp$ ./py
    段错误
    lihex@lihex-laptop:/tmp$

    [回复]

    iCyOMiK 回复:

    版本:
    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

    [回复]

    iCyOMiK 回复:

    呃。。。有没有是python2.7的可能?

    [回复]

    Dante 回复:

    呃,我觉得应该不会和python2.7有关。。
    可能是linux编译参数的问题?这个我得周一到公司试一下~

    [回复]

    iCyOMiK 回复:

    嗯,谢谢你吖,太麻烦你了,不过说真的,我觉得不同语言之间能相互调用实在太酷了。

    [回复]

    Dante 回复:

    我刚在ubuntu虚拟机上编译了一下,python2.7,
    INC = -I /usr/local/include/python2.7/
    LIB = -L /usr/local/lib/ -lpython2.7 -L/usr/lib/ -lssl -lcrypto
    编译会失败,应该是有一些包没装,我找时间看一下~

    [回复]

    Dante 回复:

    原因找到了,要加入这两行
    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
    PyRun_SimpleString(“import sys”);
    PyRun_SimpleString(“sys.path.append(‘./’)”);

    [回复]

    iCyOMiK 回复:

    呃,之前还以为你把这件事情忘记了呢~呵呵,我去试试~真的很感谢你的贡献~相信很多人看到后都会获益的,要不你修改一下原文,把它加上去吧~

    [回复]

    iCyOMiK 回复:

    呃,原来你已经加上去了~呵呵~测试成功,感谢,迟些再把该文章转走,放心,我会留原文链接的哈!!

    [回复]

    Dante 回复:

    有用就好,哈哈~~最近在继续深入研究这一块,还是发现了不少问题的~以后会继续写几篇文章总结~

    [回复]

    sly 回复:

    我的代码和你的一样,Makefile,也一样
    就是编译不过去,总是提示我Py_Initialize() 函数未定义,头文件 #include

    [回复]

  3. […] 作者:Dante    来源: Vimer […]

  4. Bruce说道:

    看到这里才debug好,感谢感谢!

    [回复]

发表评论