如何实现Python调用C代码--python与C之间如何通信(swig)
转载: https://www.zhihu.com/question/23003213
1. C代码如何调用Python
1.1 test
#include <Python.h> int main(int argc, char *argv[])
{
Py_SetProgramName(argv[]);
Py_Initialize(); PyRun_SimpleString("print ('Hello Python!')\n"); Py_Finalize(); return ; }
Linux下执行:
gcc -Wall cpython01.c -o cpython01.out -I/usr/include/python2. -lpython2.
注意是Python2.7不是python3...不然好像报错....

1.2 C调用Python函数
great_module.py
#!/usr/bin/python3
#-*- coding:utf-8 -*- def great_function(a):
return a + 1
include_module_from_py.c
#include <stdio.h>
#include <Python.h> int include_module_from_py(int a)
{
int res = 0;
PyObject *pModule, *pFunc;
PyObject *pArgs, *pValue; //import great_module.py
pModule = PyImport_Import(PyString_FromString("great_module")); // //great_module.great_function(args)
pFunc = PyObject_GetAttrString(pModule, "great_function"); //build args
pArgs = PyTuple_New(1); //Pyxxx_new录创建类型为xxx的变量
PyTuple_SetItem(pArgs, 0, PyInt_FromLong(a)); //若a为tuple, 则a[i]=b对应于 PyTuple_SetItem(a, i, b) //call
pValue = PyObject_CallObject(pFunc, pArgs); res = PyInt_AsLong(pValue); return res;
} int main()
{ Py_Initialize(); printf("res = %d\n", include_module_from_py(3)); Py_Finalize(); return 0;
}
运行时,需要先:
export PYTHONPATH=.:$PYTHONPATH
编译:
gcc -Wall include_module_from_py.c -o include_module.out -I/usr/include/python2.7 -lpython2.7

2. python调用C/C++
great_module.c
#include <stdio.h>
#include <Python.h> int great_function(int a)
{
return a + 1;
} static PyObject * _great_function(PyObject *self, PyObject *args)
{
int _a;
int res; //负责将Python的参数转换为C的参数
if (!PyArg_ParseTuple(args, "i", &_a))
{
return NULL;
} res = great_function(_a); return PyLong_FromLong(res); } //导出表, 负责告诉Python这个模块有哪些函数可以被Python调用
static PyMethodDef GreateModuleMethods[] = {
{
"great_function", // 函数名
_great_function, // 包裹函数
METH_VARARGS, // 参数变长
"" // 说明性文字
},
{ NULL, NULL, 0, NULL } //总是如此
}; //导出函数, 名字: module名称+前缀init
PyMODINIT_FUNC initgreat_module()
{ (void) Py_InitModule("great_module", GreateModuleMethods);
}
gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7 -lpython2.7

3. ctypes: Python调用C
#include <stdio.h> int add_int(int a, int b)
{
return a + b;
} double add_double(double a, double b)
{
return a + b;
}
gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
#!/usr/bin/python3
#-*- coding:utf-8 -*- from ctypes import * adder = CDLL('./adder.so') res_int = adder.add_int(4, 5)
print("4 + 5 = %d " % (res_int)) a = c_double(5.5)
b = c_double(4.1) add_double = adder.add_double
add_double.restype = c_double
print("5.5 + 4.1 = ", str(add_double(a, b)))
工作中用了之后, 想想看还是用ctypes方便点....工程生成.so动态链接库, 然后直接在Python里导入.
最好是在C代码中, 将需要的功能接口写的易调用点!! 然后Python也不需要传很多的参数, 直接获取一个结果等等...
4. 使用SWIG使Python调用C/C++
example.h
#include <iostream>
using namespace std; class Example {
public:
void say_hello(); };
example.cpp
#include "example.h" void Example::say_hello()
{
cout << "hello\n";
}
example.i
%module example
%{
#include "example.h"
%}
%include "example.h"
setup.py
#!/usr/bin/python3
#-*- coding:utf- -*- """
setup.py file for SWIG C\+\+/Python example
"""
from distutils.core import setup, Extension example_module = Extension('_example',
sources=['example.cpp', 'example_wrap.cxx',],
) setup (
name = 'example',
version = '0.1',
author = "douzi",
description = """Simple swig C\+\+/Python example""",
ext_modules = [example_module],
py_modules = ["example"],
)
然后使用:
swig -c\+\+ -python example.i
python3 setup.py build_ext --inplace

https://blog.csdn.net/gxt_gy/article/details/50341215
如何实现Python调用C代码--python与C之间如何通信(swig)的更多相关文章
- Python调用Java代码部署及初步使用
Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...
- python 调用 java代码
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- python调用Go代码
Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...
- 转python调用Go代码
Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...
- python调用Java代码,完毕JBPM工作流application
1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...
- python调用c代码2
1.生成动态链接库 [root@typhoeus79 c]# more head.c #include <stdio.h> #include <stdlib.h> typede ...
- python调用c代码
Linux环境下使用python调用C的printf例子: #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- from ctypes import * de ...
- python调用java代码 java虚拟机(jvm)
1.新建com文件夹,在里面新建 fibnq.java package com; public class fibnq { public fibnq(){} public int fb(int n){ ...
- python 调用js代码
Python2 安装pyv8 pip install-egit://github.com/brokenseal/PyV8-OS-X#egg=pyv8 from pyv8 import PyV8 c ...
随机推荐
- 【English 】20190319
BOKO鼻子['boʊkoʊ] pores毛孔['pɔ:z] cute漂亮可爱[kjut] DEKO-BOKO pores don't make a girl cute! ideal最理想的[aɪˈ ...
- day12-内置模块学习(三)
我的博客呀,从以前的预习变成了复习了,复习的东西还没有写完,哎 今日目录 1.序列化模块 2.加密模块 3.包的使用 4.random模块 5.shutil模块 开始今日份总结 1.序列化模块 在学习 ...
- 搭建vue.js环境
一.安装Node.js (以下安装环境均为win10) 下载链接:https://nodejs.org/en/download/ 官网给出了两个版本,LTS和Curren.字面意思是推荐大多数用户使用 ...
- Error:Execution failed for task ':app:processDebugManifest'. Manifest merger failed with multiple errors, see logs
这个异常在网上一搜会出现很多答案,也可能都对. 我都尝试过但是不符合我这边的要求,问题得不到解决.网上的说法是对的,jar包冲突.不过究竟是哪里冲突没办法判断. 最后尝试了一下在module的中没用的 ...
- richedit缩放
本程序下载地址: 要使文本在richedit控件上进行放大缩小,可以通过设置字体的大小,从而来达到缩放文本的目的. 下面是一个例子:通过调整滚动条,从而控制richedit文本缩放. 程序运行结果如下 ...
- iOS开发基础-图片切换(3)之属性列表
延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文 ...
- 网站添加icon
设置网站的icon<link rel="shortcut icon" href="./static/img/favicon.ico" >
- PS制作黑暗墙面上的漂亮霓虹文字
一.用ps软件打开砖墙背景素材. 二.复制一层,混合模式改为“正片叠底”,不透明度50%. 三.新建色相/饱和度调整图层,设置如下.打造夜间的气氛. 四.新建一个空白图层,设置前景色黑色.背景色白色, ...
- vuex学习总结
vuex 学习 mapState,mapGetters 一般也写在 computed 中 , mapActions 一般写在 methods中.
- Linux基础操作文件等基础操作
作业一: 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon /]# cd /etc [root@bogon etc]# cat passwd ...