转载: 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. XCopy 小技巧

    使用XCOPY Copy 一个文件时,如果目标地址没有对应的文件, 系统会提示选择是文件,还是目录,如下图所示. 有时我们不想出现这个提示,这是只需要修改目标文件的写法.如下 将 "D:\t ...

  2. Linux 下必备的性能检测工具 合集

    有些工具,值得学习学习: 网络 iftop IO  iotop 系统  top htop 保持更新,转载请注明出处. https://www.cnblogs.com/xuyaowen/p/linux- ...

  3. java-----理解java的三大特性之多态

    的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...

  4. (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

  5. RabbitMQ安装,Windows下

    一.下载安装ERLANG语言 otp_win64_20.3.exe 一直下一步.然后设置环境变量  ERLANG_HOME   C:\Program Files\erl9.3 二.安装RabbitMQ ...

  6. 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题

    最近需要https这里看到一份不错的博客,收录一下! Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla.Cisco.Akamai.IdenTrust ...

  7. Windows技巧

    1 修改域名 像Linux的/etc/hosts一样,windows也有一个类似的hosts文件, C:/WINDOWS/system32/drivers/etc/hosts 添加如下域名与IP的映射 ...

  8. React-代码规范

    1.方法绑定this,统一写在consrtructor()里. constructor(props){ ... this.handleInputChange=this.handleInputChang ...

  9. iview render input每输入一个字符就会自动跳出焦点

    假如你绑定的table的数据是tableData,input数据改变的时候你把整行的数据替换掉,就不会造成table重新渲染,导致input失焦了 h('InputNumber', { props: ...

  10. 家庭记账本小程序之改(java web基础版五)

    实现修改消费账单 1.main_left.jsp中该部分,调用Servlet中的list方法 2.Servlet中的list方法,调用Dao层的list方法,跳转到list.jsp页面 3.Dao层的 ...