转载: 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)的更多相关文章

  1. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  2. python 调用 java代码

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  3. python调用Go代码

    Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...

  4. 转python调用Go代码

    Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...

  5. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  6. python调用c代码2

    1.生成动态链接库 [root@typhoeus79 c]# more head.c #include <stdio.h> #include <stdlib.h> typede ...

  7. python调用c代码

    Linux环境下使用python调用C的printf例子: #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- from ctypes import * de ...

  8. python调用java代码 java虚拟机(jvm)

    1.新建com文件夹,在里面新建 fibnq.java package com; public class fibnq { public fibnq(){} public int fb(int n){ ...

  9. python 调用js代码

    Python2   安装pyv8 pip install-egit://github.com/brokenseal/PyV8-OS-X#egg=pyv8 from pyv8 import PyV8 c ...

随机推荐

  1. 线程池工厂方法newFixedThreadPool()和newCachedThreadPool()

    newFixedThreadPool()方法: 该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行. 若没有.则新的任务被暂存在一个任务队列中,待线程空闲时,便处理 ...

  2. oc中的委托模式

    通过一个例子来理解委托模式 首先定义个协议 协议(protocol) :它可以声明一些必须实现的方法和选择实现的方法  (在java中称为接口) // // StudentDelegate.h // ...

  3. Arduino内部网页代理,网页穿透,公网访问Arduino内部网页

    #include <ESP8266WiFi.h> const char* id     = "id";  //http://www.mcunode.com/proxy/ ...

  4. ARC089E GraphXY 构造

    传送门 在Luogu上评了"NOI"之后评级变成了"普及+/提高"--我觉得我可能要退群了 考虑构造一个这样的图: 其中上半部分是从\(S\)开始的一条长\(1 ...

  5. JVM-高效并发

    Java内存模型与线程: Java内存模型的目的是定义程序中各个变量的访问规则,此处的变量包括实例字段.静态字段和构成数组对象的元素,但不包括局部变量和方法参数,因为后者是线程私有的. Java内存模 ...

  6. Scrapy安装报错

    python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Micro ...

  7. AI要被祭天了!删Bug,删着删着把全部代码都删了

    近日,美国版的“大众点评”,本想训练 AI 来消除 bug,结果它把所有内容删除了... Yelp 在其最新更新的 App 中写道: “我们为本周使用该app遇到问题的用户致歉.我们训练了一个神经网络 ...

  8. 新Chrome浏览器不支持html5的问题

    window.applicationCache事件,最新chrome浏览器已经不能判断是否支持html5: 之前,在IE和Google中 为ApplicationCache对象,而在FF中为 Offl ...

  9. 8 ServletContext

    1 为什么需要ServletContext 技术 显示网站多少人在线,显示当前登录者是第几位登录者等信息. 2 什么是ServletContext 可以把它想象成一个服务器上的公共空间,每个用户都可以 ...

  10. 【zabbix教程系列】一、初识zabbix

    一.zabbix是什么? Zabbix是最终的企业级软件,专为实时监控从数以万计的服务器,虚拟机和网络设备收集的数百万个指标而设计. 二.zabbix能做什么? 监控任何事物,为任何类型的IT基础设备 ...