用C扩展Python3
官方文档:
https://docs.python.org/3/extending/index.html
- 交叉编译到aarch64上面
以交叉编译到aarch64上面为例,下面是Extest.c的实现:
- #include <Python.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define BUFSIZE 10
- int fac(int n) {
- if (n < )
- return ;
- return n * fac(n - );
- }
- static PyObject * Extest_fac(PyObject *self, PyObject *args) {
- int res;//计算结果值
- int num;//参数
- PyObject* retval;//返回值
- //i表示需要传递进来的参数类型为整型,如果是,就赋值给num,如果不是,返回NULL;
- res = PyArg_ParseTuple(args, "i", &num);
- if (!res) {
- //包装函数返回NULL,就会在Python调用中产生一个TypeError的异常
- return NULL;
- }
- res = fac(num);
- //需要把c中计算的结果转成python对象,i代表整数对象类型。
- retval = (PyObject *)Py_BuildValue("i", res);
- return retval;
- }
- char *reverse(char *s) {
- register char t;
- char *p = s;
- char *q = (s + (strlen(s) - ));
- while (p < q) {
- t = *p;
- *p++ = *q;
- *q-- = t;
- }
- return s;
- }
- static PyObject *
- Extest_reverse(PyObject *self, PyObject *args) {
- char *orignal;
- if (!(PyArg_ParseTuple(args, "s", &orignal))) {
- return NULL;
- }
- return (PyObject *)Py_BuildValue("s", reverse(orignal));
- }
- static PyObject *
- Extest_doppel(PyObject *self, PyObject *args) {
- char *orignal;
- char *reversed;
- PyObject * retval;
- if (!(PyArg_ParseTuple(args, "s", &orignal))) {
- return NULL;
- }
- retval = (PyObject *)Py_BuildValue("ss", orignal, reversed=reverse(strdup(orignal)));
- free(reversed);
- return retval;
- }
- static PyMethodDef
- ExtestMethods[] = {
- {"fac", Extest_fac, METH_VARARGS},
- {"doppel", Extest_doppel, METH_VARARGS},
- {"reverse", Extest_reverse, METH_VARARGS},
- {NULL, NULL},
- };
- static struct PyModuleDef ExtestModule = {
- PyModuleDef_HEAD_INIT,
- "Extest",
- NULL,
- -,
- ExtestMethods
- };
- PyMODINIT_FUNC PyInit_Extest(void)
- {
- return PyModule_Create(&ExtestModule);
- }
采用手动编译, Makefile如下:
- CFLAGS = -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
- CFLAGS += -fPIC -I /home/pengdonglin/src/qemu/python_cross_compile/Python3/aarch64/include/python3.6m
- CC = /home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.07_linux/bin/aarch64-linux-gnu-gcc
- all:Extest.so
- Extest.o: Extest.c
- $(CC) $(CFLAGS) -c $^ -o $@
- Extest.so: Extest.o
- $(CC) -pthread -shared $^ -o $@
- cp $@ /home/pengdonglin/src/qemu/python_cross_compile/Python3/aarch64/lib/python3./site-packages/
- clean:
- $(RM) *.o *.so
- .PHONY: clean all
执行make命令,就会在当前目录下生成一个Extest.so文件,然后将其放到板子上面的/usr/lib/python3.6/site-packages/下面即可
测试:
- [root@aarch64 root]# cp /mnt/Extest.so /usr/lib/python3./site-packages/
- [root@aarch64 root]# python3
- Python 3.6. (default, Mar , ::)
- [GCC 4.9. (prerelease)] on linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import Extest
- >>> Extest.fac()
- >>> Extest.reverse("pengdonglin")
- 'nilgnodgnep'
- >>> Extest.doppel("pengdonglin")
- ('pengdonglin', 'nilgnodgnep')
- 编译到x86_64上面
编写setup.py如下:
- #/usr/bin/env python3
- from distutils.core import setup, Extension
- MOD = 'Extest'
- setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest.c'])])
编译
- $/usr/local/bin/python3 ./setup.py build
- running build
- running build_ext
- building 'Extest' extension
- creating build
- creating build/temp.linux-x86_64-3.6
- gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include/python3.6m -c Extest.c -o build/temp.linux-x86_64-3.6/Extest.o
- creating build/lib.linux-x86_64-3.6
- gcc -pthread -shared build/temp.linux-x86_64-3.6/Extest.o -o build/lib.linux-x86_64-3.6/Extest.cpython-36m-x86_64-linux-gnu.so
可以看到,在Python3上面用setup.py默认生成的so的名字是Extest.cpython-36m-x86_64-linux-gnu.so
安装
- $sudo /usr/local/bin/python3 ./setup.py install
- [sudo] password for pengdonglin:
- running install
- running build
- running build_ext
- running install_lib
- copying build/lib.linux-x86_64-3.6/Extest.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3./site-packages
- running install_egg_info
- Writing /usr/local/lib/python3./site-packages/Extest-0.0.-py3..egg-info
可以看到,将Extest.cpython-36m-x86_64-linux-gnu.so拷贝到了/usr/local/lib/python3.6/site-packages下面。
测试
在PC上面输入python3命令:
- $python3
- Python 3.6. (default, Mar , ::)
- [GCC 4.8.] on linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import Extest
- >>> Extest
- <module 'Extest' from '/usr/local/lib/python3.6/site-packages/Extest.cpython-36m-x86_64-linux-gnu.so'>
- >>> Extest.fac()
- >>> Extest.reverse("pengdonglin")
- 'nilgnodgnep'
- >>> Extest.doppel("pengdonglin")
- ('pengdonglin', 'nilgnodgnep')
- >>>
可以在第7行看到加载的Extest.so的路径,而且我们只需要import Extest就可以了。
完。
用C扩展Python3的更多相关文章
- 使用C语言扩展Python3
使用C语言扩展Python3.在Python3中正确调用C函数. 1. 文件demo.c #include <Python.h> // c function static PyObject ...
- python3.5之mysql扩展
最近在学习廖雪峰的python3的教程,这是官方http://www.liaoxuefeng.com/,建议大家想学习python的同学可以去看看,真的是在网上能找到的最好文本教程,没有之一 在廖老实 ...
- 在python3中安装mysql扩展,No module named 'ConfigParser'
在python2.7中,我们安装的是 MySqldb或这 MySQL-python,能够正却安装,但在python3中,由于 其使用的扩展 ConfigParser 已经改名为 configpars ...
- Python3 与 C# 扩展之~模块专栏
代码裤子:https://github.com/lotapp/BaseCode/tree/maste 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode ...
- Python3 与 C# 扩展之~基础衍生
本文适应人群:C# or Python3 基础巩固 代码裤子: https://github.com/lotapp/BaseCode 在线编程: https://mybinder.org/v2/g ...
- Python3 与 C# 扩展之~基础拓展
上次知识回顾:https://www.cnblogs.com/dotnetcrazy/p/9278573.html 代码裤子:https://github.com/lotapp/BaseCode ...
- python3.4学习笔记(三) idle 清屏扩展插件
python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...
- Python3.x:python: extend (扩展) 与 append (追加) 的区别
Python3.x:python: extend (扩展) 与 append (追加) 的区别 1,区别: append() 方法向列表的尾部添加一个新的元素.只接受一个参数: extend()方法只 ...
- python3.x 匿名函数lambda_扩展sort
#匿名函数lambda 参数: 表达式关键字 lambda 说明它是一个匿名函数,冒号 : 前面的变量是该匿名函数的参数,冒号后面是函数的返回值,注意这里不需使用 return 关键字. ambda只 ...
随机推荐
- 支付宝:电脑网站沙箱测试(Java)
1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse readme.txt请好好看一下. 只有一 ...
- sass和scss相关知识
参考地址:http://www.imooc.com/learn/311 什么是css预处理器? CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性 ...
- 【招聘】这一次,我们Hold住了世界杯
作为国内最大的云计算服务商,阿里云在视频领域拥有绝对的技术优势,全球范围内拥有1500多个CDN节点,带宽储备120多T,不仅为优酷.CNTV.CCTV5提供技术支撑,还承担了全网70%的世界杯流量. ...
- C#获取特定进程CPU和内存使用率
首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetCurrentProcess()方法来获取当前程序所对应的进程 ...
- Java编程的逻辑 (24) - 异常 (上)
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- read命令
read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合. 该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开.在read命令后面,如果没有指定变量名,读取的数据将被 ...
- 【LOJ】#2084. 「NOI2016」网格
题解 之前用的mapTLE了,今天用了个hash把题卡了过去,AC数++ 我们只要保留一个点为中心周围5 * 5个格子就可以 如果一个点周围5*5个格子有两个不连通,那么显然输出0 如果一个出现了一个 ...
- 1195: [HNOI2006]最短母串
思路:好像以前谁问过我这题... 状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系, dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i ...
- myBatsi调用存储过程
1.结构 2.准备数据 建表和插入数据 CREATE TABLE p_user( id INT PRIMARY KEY AUTO_INCREMENT, name ), sex ) ); INSERT ...
- hibernate Validator 6.X 的学习,bean的约束(主要包括的是容器元素的验证)
1. 四:案例二(property的验证) 1.