如何实现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 ...
随机推荐
- Elixir 分布式平台
概述 分布式平台的核心在于并发,容错. 而 Elixir 的优势正是在于对于并发和容错的处理. 分布式模型 CSP(Communicating Sequential Process) 模型 :: 多个 ...
- Spring注解定时器使用
一.首先要配置我们的spring-service.xml 1.xmlns 多加下面的内容 xmlns:task="http://www.springframework.org/schema/ ...
- sanic set up
(venv) MacBook-Pro:bin shihw$ pip3 install sanicCollecting sanic Downloading https://files.pythonhos ...
- JDK1.8源码(十)——java.util.LinkedHashSet类
同 HashSet 与 HashMap 的关系一样,本篇博客所介绍的 LinkedHashSet 和 LinkedHashMap 也是一致的.在 JDK 集合框架中,类似 Set 集合通常都是由对应的 ...
- easyui-tab标签
一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...
- java高级-动态注入替换类Instrumentation
介绍 利用java.lang.instrument(容器类) 做动态 Instrumentation(执行容器) 是 Java SE 5 的新特性. 使用 Instrumentation,开发者可以构 ...
- RabbitMQ学习笔记一:本地Windows环境安装RabbitMQ Server
一:安装RabbitMQ需要先安装Erlang语言开发包,百度网盘地址:http://pan.baidu.com/s/1jH8S2u6.直接下载地址:http://erlang.org/downloa ...
- PS调出米黄色复古柔和外景人物照
配色思路 从片中可以看出主要景物近处的有人物和栏杆,远处的海水,天空和礁石.为体现出远近层次,近处景物选择了偏黄的色调,远处景物选择了偏青色调. 调色 以下面这张照片为例,先放上对比图: LR部分 首 ...
- powershell 函数, foreach中格式化
function testArg { $n = 1; if($args.Count -eq 0) { "No arg!" } else { $args | foreach {&qu ...
- jmeter学习记录--07--jmeter元件
通过jmeter元件可以模拟负载.参数化.设置关联.设置检查点.设置集合点.控制场景运行.监控测试结果等. 1.逻辑控制器:比如foreach控制器,查询到了订单并要对每个订单进行出库操作,以订单号作 ...