转载: https://www.zhihu.com/question/23003213

1. C代码如何调用Python

1.1 test

#include <Python.h>    int main(int argc, char *argv[])
{Py_SetProgramName(argv[0]);Py_Initialize();   PyRun_SimpleString("print ('Hello Python!')\n");Py_Finalize();return 0;}

Linux下执行:

gcc -Wall cpython01.c -o cpython01.out -I/usr/include/python2.7 -lpython2.7

注意是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 argspArgs = PyTuple_New(1);                           //Pyxxx_new录创建类型为xxx的变量PyTuple_SetItem(pArgs, 0, PyInt_FromLong(a));     //若a为tuple, 则a[i]=b对应于 PyTuple_SetItem(a, i, b)//callpValue = 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-8 -*-"""
setup.py file for SWIG C\+\+/Python example
"""
from distutils.core import setup, Extensionexample_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

转载于:https://www.cnblogs.com/douzujun/p/10738959.html

如何实现Python调用C代码--python与C之间如何通信(swig)相关推荐

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

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

  2. python调用java代码方法

    前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...

  3. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  4. python调用opencv代码_Python调用OpenCV实现图像平滑代码实例

    主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波. 给图像增加噪声: import cv2 import numpy as np def test ...

  5. python调用c代码

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

  6. python调用shell命令-python调用shell命令小结

    在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen.默认情况下subprocess.call的方法结果是返回值 ...

  7. python脚本中执行另一个脚本_如何用python调用另一个python脚本?

    如果想要将已经设置好的内容,在转移到另一个位置要怎么做呢?小编能写到的方法有,照抄,复制,以及转移使用.在我们日常办公上是非常好理解的,就是ctr v,但是如果想在编程上,将某一位置拿去到别的项目上使 ...

  8. python调用lib_基于python调用libvirt API

    基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...

  9. python入门经典代码-python经典入门学习锦集就这篇够了,强烈建议收藏!

    原标题:python经典入门学习锦集就这篇够了,强烈建议收藏! Python 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 由 Guido van ...

最新文章

  1. VB100年底测试:McAfee金山遗憾出局 瑞星表现令人意外
  2. Swoole入门指南:PHP7安装Swoole详细教程(一)
  3. element-ui如何进行调试
  4. telnet入侵linux,教你入侵RedHatLinux
  5. javascript实现的一个信息提示的小功能/
  6. plantUml活动图(新语法)
  7. 马哥Linux2016最新高薪运维视频课程
  8. vs不能调试_20200717调试记录(五十四)
  9. [转]使用Hyper-V BPA(Best Practices Analyzer-最佳化分析工具)
  10. Devcpp(Dev-C++)代码编辑的快捷键
  11. 微信小程序开发教程:WeUI一个专为微信小程序设计的UI框架
  12. 在Arduino和ESP32-s2环境下,测试WiFi Fine Time Measurement (FTM) Round Trip Time (RTT) 的定位和测距
  13. 把脉大连接:“多端协同”的大动脉与“多人协作”的主动脉
  14. java增大字體_往JRE里增加字体
  15. 前端自学日记-day5
  16. java word插件开发_java生成word的几种方案
  17. 您计算机处于状态或者您计算机时钟设置,您的Windows 10时间不正确? 这是如何固定时钟 | MOS86...
  18. 创业起步?先收藏这份终极指南
  19. 龚文祥:VC看B2C的5个核心数据
  20. 中职计算机应用专业课堂教学,谈谈中职计算机应用基础课程教学中翻转课堂研究...

热门文章

  1. Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】
  2. 自己写一个java.lang.reflect.Proxy代理的实现
  3. Information Retrieval --- Outline
  4. Objective-C超高精度的计时器
  5. 卡莱特led显示屏调试教程_镇康室内LED显示屏型号
  6. 桌面时钟代码_被遗忘的手机桌面小部件
  7. Hadoop系列-HDFS HA高可用集群
  8. (54)FPGA基础编码D触发器(三)
  9. (78)FPGA内部资源与FPGA开发流程-面试必问(二)(第16天)
  10. (97)FPGA DCM与PMCD区别?