c/c++再学习:C与Python相互调用
c/c++再学习:Python调用C函数
Python 调用C函数比较简单
这里两个例子,一个是直接调用参数,另一个是调用结构体
C代码
typedef struct {
int i1;
int i2;
char str[20];
} core_data_t;
__declspec(dllexport) int add(int a, int b)
{
return a + b;
}
__declspec(dllexport) int multi(int a, int b)
{
return a * b;
}
__declspec(dllexport) int struct_add(core_data_t* data)
{
printf("%s\n", data->str);
return data->i1 + data->i2;
}
python代码
from ctypes import *
core = CDLL('core.dll')
add_val = core.add(1, 2)
multi_val = core.multi(2, 3)
print(add_val)
print(multi_val)
class CoreData(Structure):
_fields_ = [("i1", c_int),
("i2", c_int),
("str", c_char*20)]
coredata = CoreData()
coredata.i1 = 10
coredata.i2 = 20
coredata.str = b"hello world"
coredata_ptr = byref(coredata)
struct_add_val = core.struct_add(coredata_ptr)
print(struct_add_val)
结果
3
6
30
hello world
C调用python函数
c调用python,需要在增加<Python.h>和python36.lib,有时遇到编译时需要python36_d.lib时,只需要将python36.lib复制重命名为python36_d.lib放在同目录下即可
python代码
def py_print():
print("py_print")
def py_add(a,b):
return a+b
c代码
#include "stdio.h"
#include "windows.h"
#include <Python.h>
void main()
{
Py_Initialize();
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pArgs = NULL;
PyObject* pValue = NULL;
pModule = PyImport_ImportModule("python_demo");
pFunc = PyObject_GetAttrString(pModule, "py_print");
PyEval_CallObject(pFunc, NULL);
pFunc = PyObject_GetAttrString(pModule, "py_add");
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 10));
pValue = PyEval_CallObject(pFunc, pArgs);
int res = 0;
PyArg_Parse(pValue, "i", &res);
printf("res %d\n", res);
Py_Finalize();
return;
}
结果
py_print
res 15
c/c++再学习:C与Python相互调用的更多相关文章
- IronPython C#与Python相互调用
ironphy microsoft.scripting dll using System;using System.Collections.Generic;using System.Linq;usi ...
- python模块--如何相互调用自己写的模块
一.模块相互调用同级目录调用时的两种方法 import module print(module.add(3,8)) from module import add print(add(2,4)) 同级目 ...
- 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则 摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...
- Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Python学习之二:Python 与 C 区别
引自http://www.lxway.com/181844.htm 从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive into Python两本书.话说半个月看两本,是 ...
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...
- Python实例浅谈之三Python与C/C++相互调用
一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
随机推荐
- SpringBoot文件上传(MVC情况和webFlux情况)
MVC情况 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- 如何快速上手Mac
网络上关于Mac的教程很多,大部分问题通过百度和谷歌就能搞定了.对于技巧的细节,我将不再过多的重复,看了我的参考资料基本就能够全部了解,他们也比我讲得详细得很多.我这篇文章想做的,是以一个普通的win ...
- python模拟页面调度LRU算法
所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LRU算法时,输 ...
- work behind corp proxy
=================================proxy 的写法=================================一般写法是: http://my.proxy.ad ...
- [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践
本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...
- Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)
学习架构: 由于Koa2已经支持ES6及更高版本,包括支持async方法,所以请读者保证Node.js版本在7.6.0以上.如果需要在低于7.6的版本中应用Koa的async方法,建议使用Babel ...
- 安卓ADB学习笔记
ADB(Android Debug Bridge)可以远程调试安卓设备,包括模拟器,可以进入终端模式(安卓本身相当于一个linux) 1.配置adb环境变量 以夜神模拟器为例,将模拟器安装路径里的bi ...
- setLocale(java.util.Locale), setCharacterEncoding(java.lang.String),setContentType(java.lang.String type)
对于setCharacterEncoding(java.lang.String),这个方法是javax.servlet.ServletRequest和javax.servlet.ServletResp ...
- poj2689 Prime Distance题解报告
题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...
- 在线制作微信跳转浏览器下载app/打开指定页面源码
微信自动跳转外部浏览器下载app/打开指定页面源码 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防拦截 ...