混编的含义有两种,

一种是在python里面写C

一种是C里面写python

本文针对第一种,参考链接来自:

https://www.cnblogs.com/apexchu/p/5015961.html

本文主要是进行简化,方便使用。

#####################################################################################################

第一种、Python调用C动态链接库(利用ctypes)

pycall.c

/***gcc -o libpycall.so -shared -fPIC pycall.c*/
#include <stdio.h>
#include <stdlib.h>
int foo(int a, int b)
{  printf("you input %d and %d\n", a, b);  return a+b;
}

pycall.py

import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./libpycall.so")
lib.foo(1, 3)
print '***finish***'  

运行方法:

gcc -o libpycall.so -shared -fPIC pycall.c
python pycall.py

#####################################################################################################

第2种、Python调用C++(类)动态链接库(利用ctypes)

pycallclass.cpp

#include <iostream>
using namespace std;  class TestLib
{  public:  void display();  void display(int a);
};
void TestLib::display() {  cout<<"First display"<<endl;
}  void TestLib::display(int a) {  cout<<"Second display:"<<a<<endl;
}
extern "C" {  TestLib obj;  void display() {  obj.display();   }  void display_int() {  obj.display(2);   }
}

pycallclass.py

import ctypes
so = ctypes.cdll.LoadLibrary
lib = so("./libpycallclass.so")
print 'display()'
lib.display()
print 'display(100)'
lib.display_int(100)

运行方法:

g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp
python pycallclass.py

#####################################################################################################

第3种、Python调用C和C++可执行程序

main.cpp

#include <iostream>
using namespace std;
int test()
{  int a = 10, b = 5;  return a+b;
}
int main()
{  cout<<"---begin---"<<endl;  int num = test();  cout<<"num="<<num<<endl;  cout<<"---end---"<<endl;
}

main.py

import commands
import os
main = "./testmain"
if os.path.exists(main):  rc, out = commands.getstatusoutput(main)  print 'rc = %d, \nout = %s' % (rc, out)  print '*'*10
f = os.popen(main)
data = f.readlines()
f.close()
print data  print '*'*10
os.system(main)

运行方法(只有这种不是生成.so然后让python文件来调用):

g++ -o testmain main.cpp
python main.py

#####################################################################################################

第4种、扩展Python(C++为Python编写扩展模块)(超级麻烦的一种)

Extest2.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  int fac(int n)
{  if (n < 2) return(1);  return (n)*fac(n-1);
}  char *reverse(char *s)
{  register char t,  *p = s,  *q = (s + (strlen(s) - 1));  while (s && (p < q))  {  t = *p;  *p++ = *q;  *q-- = t;  }  return(s);
}  int test()
{  char s[BUFSIZ];  printf("4! == %d\n", fac(4));  printf("8! == %d\n", fac(8));  printf("12! == %d\n", fac(12));  strcpy(s, "abcdef");  printf("reversing 'abcdef', we get '%s'\n", \  reverse(s));  strcpy(s, "madam");  printf("reversing 'madam', we get '%s'\n", \  reverse(s));  return 0;
}  #include "Python.h"  static PyObject *
Extest_fac(PyObject *self, PyObject *args)
{  int num;  if (!PyArg_ParseTuple(args, "i", &num))  return NULL;  return (PyObject*)Py_BuildValue("i", fac(num));
}  static PyObject *
Extest_doppel(PyObject *self, PyObject *args)
{  char *orig_str;  char *dupe_str;  PyObject* retval;  if (!PyArg_ParseTuple(args, "s", &orig_str))  return NULL;  retval = (PyObject*)Py_BuildValue("ss", orig_str,  dupe_str=reverse(strdup(orig_str)));  free(dupe_str);             return retval;
}  static PyObject *
Extest_test(PyObject *self, PyObject *args)
{  test();  return (PyObject*)Py_BuildValue("");
}  static PyMethodDef
ExtestMethods[] =
{  { "fac", Extest_fac, METH_VARARGS },  { "doppel", Extest_doppel, METH_VARARGS },  { "test", Extest_test, METH_VARARGS },  { NULL, NULL },
};  void initExtest()
{  Py_InitModule("Extest", ExtestMethods);
}

setup.py

#!/usr/bin/env python  from distutils.core import setup, Extension  MOD = 'Extest'
setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest2.c'])])

运行方法:

python setup.py build
cd build/lib.linux-x86_64-2.7
进入python交互模式>>>
import Extest
Extest.test()

python与C、C++混编的四种方式相关推荐

  1. python与c混合编程 版本_python与C、C++混编的四种方式(小结)

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  2. python和c混编_python与C、C++混编的四种方式(小结)

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  3. python c++情侣网名含义_python与C、C++混编的四种方式(小结)

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  4. python和c语言混合编程-python和C语言混编的几种方式

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7594551.html 作者:窗户 Q ...

  5. python异常处理的方法_python异常处理的四种方式,不只是try

    对于python程序中,进行异常捕获,一般我们都用try except,但是还有其他方式经常使用. 以后再进行异常处理时,知道有四种方式,可以考虑更合适的方式 下面介绍一下四种方式 1.内部抛出异常( ...

  6. python与c语言混合编程_python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  7. PHP/HTML混写的四种方式

    PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 这是最初级的方法了,用法就像下面这样 &l ...

  8. Python、C/C++混编实现最短路径可视化—Dijkstra算法

    摘 要   本文讲述的是主要是运用C/C++语言Dijkstra算法来完成交通图的存储.图中任一顶点到其余任意一顶点间的最短路径问题,并利用Python中的复杂网络分析库Networkx来绘制有向图以 ...

  9. python定时任务_Python3实现定时任务的四种方式

    最近做一个小程序开发任务,主要负责后台部分开发:根据项目需求,需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次: 2>商品定时上线: 3>定时检测后台服务是否存 ...

最新文章

  1. 开源oa_开源OA:可以轻松支持云文档管理
  2. 远程桌面的分辨率最大不会超过本机真实物理机的分辨率
  3. day22-Model数据验证以及钩子
  4. C++ Data语意学
  5. 一张图看懂单机/集群/热备/磁盘阵列(RAID)
  6. java获取上周任意一天的日期
  7. 《libGDX移动游戏开发从入门到精通》一1.5 其他的一些准备工作
  8. 关于最新版的JCreator只能编译不能运行的问题
  9. c语言数学函数库根号程序,用C 编写程序时根号肿么输入
  10. PLC控制一阶惯性纯滞后系统的大林(Dahlin)算法详解(SCL代码)
  11. php 显示探针_X 探针(刘海探针)-免费开源 PHP 探针
  12. 九宫格日记-2011年11月13日
  13. Windows操作系统----安全机制----Token
  14. 携程的供应链和流量逻辑|一点财经
  15. (基础篇1-15)项目架构简介及环境搭建
  16. JAVA校招基础面试题
  17. FeedBurner: 使用RSS路由器的风险
  18. Android studio app启动时默认启动页面为自定义界面
  19. Buuctf—极客大挑战练习
  20. DPLL 算法(求解k-SAT问题)详解(C++实现)

热门文章

  1. 修改NLS_DATE_FORMAT的四种方式
  2. 《Getting Real》读书笔记
  3. ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】
  4. 论文总结:Fast and Light Bandwidth Testing for Internet Users(21‘ NSDI)
  5. 前端模块规范AMD/UMD/CommonJs
  6. mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值
  7. 台式电脑如何截屏_如何选购台式电脑显卡?小白装机通俗易懂的独立显卡知识指南...
  8. bat文件先杀掉端口号,然后启动jar包
  9. JavaScript面向对象——封装及相关原理解析
  10. CSS3之计算长度值------calc()