swig c++ python

原创 2018年04月15日 18:40:00

最近帮运营用 python 做实时提取玩家数据的脚本。鉴于已有后台的 lua 和 c++ 的 api 相互调用是使用 swig,python 也就直接使用 swig 了。

swig 的官网和中文官网:swig 官网 swig 中文

网上写的比较好的博客也有:好的博客

先说下代码流程:

//test.cpp
#include <iostream>
#include "test.h"
using namespace std;
int numCount = 1;
void AddNum()
{
//      int i = 1;
        while(numCount){
                cout<<"numCount: "<<numCount<<endl;
                if (numCount==10)
                        numCount=1;
                else
                        numCount++;
                sleep(1);
        }
}

int GetNum()
{
        return numCount;
}
//test.h
#include <iostream>
#include <unistd.h>
extern int numCount;

void AddNum();
int GetNum();
//test.i
%module test
%{
        #include "test.h"

%}
        %include "test.h"

编译命令:

swig -python -c++ test.i
g++ -c -fpic test.cpp test_wrap.cxx -I/usr/include/python2.6 -Xlinker -export-dynamic
g++ -fpic -shared test.o test_wrap.o -o _test.so -Xlinker -export-dynamic

验证:

Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.GetNum()
1

这样的话在 python 中传入玩家 id 就可以运行 c++ 程序中的实时数据了。

用法等等官网都有很详细的说明,但是遇到的问题很多,swig 再不同平台编译的时候有很多差别,官网上也给出了三种操作系统的编译方式,然而在实际操作中不同的 linux 版本会带来不同的错误。

比如 错误:Python.h:没有那个文件或目录 就需要执行 sudo yum install python-devel

还有两个 需要注意的编译选项:

-fpic  (https://www.cnblogs.com/cswuyg/p/3830703.html)
 -Xlinker -export-dynamic  (https://blog.csdn.net/jq0123/article/details/1340839)
如果这两个选项不加也会出现编译通过,但导入模块的时候出错。
关于c++ linux下编译的基础知识:在linux环境下编译C++ 程序


【工作总结】通过SWIG实现 python 和 c++ 互相通信

1. 应用场景和需求:
  • ghgui008
  • ghgui008
  • 2014-05-01 17:02:46
  • 1319

【Python】SWIG 和 Python——c/c++与脚本交互

C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台。对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interfac...
  • u012330429
  • u012330429
  • 2016-03-30 13:06:42
  • 767

linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)

第一次用swig,网上找了各种资料,比如 http://www.cnblogs.com/kaituorensheng/p/4464117.html 入门可以看上面这个链接 但要么过于简单要么过于复杂...
  • gxt_gy
  • gxt_gy
  • 2015-12-17 14:25:30
  • 1283

Windows下python使用SWIG调用C++ dll

有一dll和对应的lib文件,含有以下函数: test.h class Test { private: int a; int b; public: int r; Test(int, int...
  • tobacco5648
  • tobacco5648
  • 2014-04-22 12:59:20
  • 21267

通过SWIG封装C/C++代码被Python调用

1.介绍 SWIG将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrapc为后缀的...
  • lzl001
  • lzl001
  • 2014-02-28 13:45:22
  • 1324

windows下用swig实现python调用C\C++的方法

windows下用swig实现python调用C\C++的方法本文技术平台:win7,vs2010,python2.7(64位)1.下载swig在[www.swig.org]官网上下载相应的安装包,下...
  • perfectmanman
  • perfectmanman
  • 2015-07-16 10:56:31
  • 588

利用swig实现python调用C/C++的方法

利用swig实现python调用C/C++的方法  Python是一门语法简单而且清晰的脚本语言,不过执行效率比较低。简单的说就是开发相对C/C++容易,但是执行效率不如C/C++,甚至有人称之...
  • liangzhao_jay
  • liangzhao_jay
  • 2015-04-10 10:27:17
  • 1090

swig 把c/c++ 封装成python可调用的so文动态链接库

注意:使用此种方法产生的so文件放在 python的site 目录下,可以直接import example,调用模块。 C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台。对开发人员的一个...
  • u013378306
  • u013378306
  • 2017-04-14 15:13:41
  • 1881

高效开发Python扩展模块方法:用SWIG封装C/C++代码

1. SWIG介绍: http://sourceforge.net/projects/swig/ 2. 对于性能有追求的功能模块(这并不意味着python性能低),自然需要考虑用C/C++...
  • kof98765
  • kof98765
  • 2014-11-24 16:29:45
  • 2059

python通过swig调用c++dll时指针的用法

当Python和C++的接口涉及到缓冲区时,可以在Python中创建缓冲区,再将缓冲区的指针传给C++函数(通过创建额外的函数进行转换)。实例如下: Python端: 1.获取str表示的...
  • tobacco5648
  • tobacco5648
  • 2014-11-13 17:53:02
  • 20931
收藏助手
不良信息举报
您举报文章:swig c++ python
举报原因:
原因补充:

(最多只允许输入30个字)