如何实现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 ...
随机推荐
- XCopy 小技巧
使用XCOPY Copy 一个文件时,如果目标地址没有对应的文件, 系统会提示选择是文件,还是目录,如下图所示. 有时我们不想出现这个提示,这是只需要修改目标文件的写法.如下 将 "D:\t ...
- Linux 下必备的性能检测工具 合集
有些工具,值得学习学习: 网络 iftop IO iotop 系统 top htop 保持更新,转载请注明出处. https://www.cnblogs.com/xuyaowen/p/linux- ...
- java-----理解java的三大特性之多态
的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...
- (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- RabbitMQ安装,Windows下
一.下载安装ERLANG语言 otp_win64_20.3.exe 一直下一步.然后设置环境变量 ERLANG_HOME C:\Program Files\erl9.3 二.安装RabbitMQ ...
- 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
最近需要https这里看到一份不错的博客,收录一下! Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla.Cisco.Akamai.IdenTrust ...
- Windows技巧
1 修改域名 像Linux的/etc/hosts一样,windows也有一个类似的hosts文件, C:/WINDOWS/system32/drivers/etc/hosts 添加如下域名与IP的映射 ...
- React-代码规范
1.方法绑定this,统一写在consrtructor()里. constructor(props){ ... this.handleInputChange=this.handleInputChang ...
- iview render input每输入一个字符就会自动跳出焦点
假如你绑定的table的数据是tableData,input数据改变的时候你把整行的数据替换掉,就不会造成table重新渲染,导致input失焦了 h('InputNumber', { props: ...
- 家庭记账本小程序之改(java web基础版五)
实现修改消费账单 1.main_left.jsp中该部分,调用Servlet中的list方法 2.Servlet中的list方法,调用Dao层的list方法,跳转到list.jsp页面 3.Dao层的 ...