python 扩展c extention
首先我们会使用PyMODINIT_FUNC 和PyMethodDef 进行创建c的扩展。
关于PyMethodDef可以的参数含义可以在官网查看
第一步
// 简单的say hello 函数
static PyObject* say_hello(PyObject* self, PyObject* args) {const char* name;if (!PyArg_ParseTuple(args, "s", &name))return NULL;printf("Hello %s!\n", name);Py_RETURN_NONE;
}// lambda 函数调用
void set_seed(int seed) {printf("seed %d!\n", seed);
}// PyMethodDef methods 函数
static void init_module(PyModuleDef* mdef, PyObject* m) {mdef->m_doc = "Inner c++ core of test";typedef PyObject* (*Myds)(PyObject*,PyObject**,int64_t,PyObject*);static PyMethodDef methods[] = {{"hello", (PyCFunction)say_hello, METH_VARARGS, NULL},// lambda 函数{ "lambda_hello",(PyCFunction)(Myds)[](PyObject* self, PyObject** args, int64_t n, PyObject* kw) -> PyObject* {try {uint64_t arg_filled=0;(void)arg_filled;if (n+(kw?Py_SIZE(kw):0)<=1 && n+(kw?Py_SIZE(kw):0)>=1 && PyLong_CheckExact(args[0])) {int arg0 = PyLong_AsLong(args[0]);//!PyErr_Occurred();if (kw) {auto kw_n = Py_SIZE(kw);for (int i=0; i<kw_n; i++) {auto ko = PyTuple_GET_ITEM(kw, i);auto vo = args[i+n];auto ks = PyUnicode_AsUTF8(ko);uint khash = leetcode::hash(ks);if (khash == 16948695u) {// hash match seedCHECK((PyLong_CheckExact(vo)));arg0 = PyLong_AsLong(vo);arg_filled |= 1ull << 0;continue;}LOGf << "Not a valid keyword:" << ks;}}return GET_PY_NONE((set_seed(arg0)));}} catch (const std::exception& e) {std::stringstream ss;ss << "Wrong inputs arguments";PyErr_Format(PyExc_RuntimeError,"%s\n%s\nFailed reason:%s",ss.str().c_str(),R""(The function declarations are:void lambda_hello(int seed))"",e.what());}return nullptr;},METH_FASTCALL | METH_KEYWORDS,R""(Document:lambda_helloDeclaration:void lambda_hello(int seed))""},{NULL, NULL, 0, NULL}};PyModule_AddFunctions(m, methods);
}// 定义Extention的入口 PyMODINIT_FUNC
#define PYJF_MODULE_INIT(name) \
PyMODINIT_FUNC PyInit_##name() { \PyObject *m; \try { \PyModuleDef *def = new PyModuleDef(); \memset(def, 0, sizeof(PyModuleDef)); \def->m_name = #name; \def->m_doc = ""; \def->m_size = -1; \Py_INCREF(def); \m = PyModule_Create(def); \init_module(def, m); \} catch(const std::exception& e) { \PyErr_SetString(PyExc_RuntimeError, e.what()); \return nullptr; \} \return m; \
}// 声明
PYJF_MODULE_INIT(example_name)
详细的项目代码见github
python 扩展c extention相关推荐
- python文件编译_将c程序编译为python扩展,生成.whl文件
借鉴的文章会在文章末尾会逐一给出 1. 对c文件进行编译 先确保要实现的代码运行成功,然后将main()函数删除,例如test.c文件 void test_func(char *str){ FILE ...
- Python 扩展 Op
Python 扩展 Op 注意 :本文涉及的 Python Kernel 仅在 gcc 4.8.5 编译环境下充分测试,进一步的完善计划见 Issue 3951. 背景介绍 OneFlow 将各种对于 ...
- TensorFlow常用Python扩展包
TensorFlow常用Python扩展包 TensorFlow 能够实现大部分神经网络的功能.但是,这还是不够的.对于预处理任务.序列化甚至绘图任务,还需要更多的 Python 包. 下面列出了一些 ...
- python基础:python扩展包的安装方式
python扩展包有三种安装方式: 1. pip安装方式.python3默认自带pip,无需另外安装:在python2.7版本上默认为easy_install安装工作进行安装,如果需要使用pip安装, ...
- 无法激活“Pylance“扩展, 因为它依赖于未加载的 Python 扩展。解决办法
"无法激活 "Pylance" 扩展, 因为它依赖于未加载的 "Python" 扩展.解决办法 卸载Python扩展(如果你有pylance先卸载它) ...
- zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
点击蓝字 ! 关注我们 "Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国, ...
- python扩展库安装
[centos下python扩展库安装] pip 是 Python 包管理工具,提供了对Python 包的查找.下载.安装.卸载的功能. python.org 上最新版本的安装包,都已经自带了该工具. ...
- python扩展包安装_python怎么安装扩展包
以安装扩展包SymPy为例: 方式一: 格式:pip install xxx //xxx:包名 示例:pip install SymPy 方式二: 如果有安装Git,也可以使用pip+git的方式安装 ...
- python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...
[填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...
最新文章
- ie focus bug
- python3精要(3)-python对象类型,数字,序列
- 十六、去年写的pandas使用方法梳理,2020年5月13日整理
- 每日程序C语言14-小球反弹高度问题
- Python模块: 命令行解析optionparser
- BeginnersBook Java 集合教程
- 开发 问卷调查案例_云南泸沽湖摩梭文化原真性保持与旅游开发协调研究
- Asp.net通过Gmail发送邮件
- 19电子设计速成实战宝典pdf_开发宝典丛书:Visual C++编程实战宝典PDF
- c语言程序分数化简,C ++中的简化分数
- 各省简称 拼音 缩写_省份简称拼音
- 备战数学建模34-BP神经网络预测2
- 地理信息系统(汤国安)重点整理和推导(第一章)
- 解压版tomcat安装配置
- 【Matplotlib:隐藏边框,显示单个网格线,设置刻度间隔,隐藏刻度线】
- armabi armabi-v7a armabi-v8a 区别
- 安卓插件化学习 - 类的加载
- 下一代个性化推荐系统
- GSM技术类有哪些最新发表的毕业论文呢?
- 陈泽天 java_百名“程序猿”捉对较量 600组小分队远程亮剑
热门文章
- html中支持透明图片的格式,IE6 png图片透明的解决方法教程
- CC00010.hadoop——|HadoopImpala.V10|——|Impala.v10|集群实现|负载均衡.v01|
- 加一度分享:快手PK抖音,谁更有优势
- 酸菜鱼,新一代微商暴富大机会?
- win2012 r2/win2016修改域密码复杂度策略
- 解决:Data truncation: Data too long for column ‘XXX‘ at row 1
- 电磁阀peakhold驱动
- 为skynet的crypt库扩展一些加密(摘要)算法支持
- CRISPR技术有效的防止脱靶现象方法
- 对视频文件进行简单的加密