python 集成cython 简单测试
实际开发中我们可能需要集成c/c++ 编写的模块,我们可以通过cython 解决类似的问题
以下测试一个简单的c add 方法, 使用venv 同时构建为一个pip 包
环境准备
- venv 初始化
python3 -m venv .
- 添加项目依赖包
pip install click cython
- 代码结构
├── Makefile
├── README.md
├── cli
│ ├── __init__.py
│ └── app.pyx
├── ext
│ ├── Makefile
│ ├── add.c
│ ├── add.h
├── pyvenv.cfg
└── setup.py
- c 项目代码说明
ext 目录为c add 函数同时make 进行项目构建
add.h
int add(int first,int second);
add.c
#include "add.h"
int add(int first,int second){
return first+second;
}
Makefile: 主要是进行静态库的构建
CC = gcc
default: libadd.a
libadd.a: add.o
ar rcs $@ $^
add.o: add.c add.h
$(CC) -c $<
clean:
rm *.o *.a
- cython 包装c 静态库
lib/app.pyx
cdef extern from "../ext/add.h":
int add(int first,int second)
def py_add(first: int,second: int) -> int:
return add(first,second)
- 配置代码生成
主要是通过setup.py 定义,注意需要安装cyhton 包
import setuptools
from distutils.extension import Extension
from Cython.Build import cythonize
with open("README.md", "r") as fh:
long_description = fh.read()
// 配置依赖的c 静态库
add_extension = Extension(
name="add_app",
sources=["./cli/app.pyx"],
libraries=["add"],
library_dirs=["ext"],
include_dirs=["ext"]
)
setuptools.setup(
name="dalongrong_cythoncli",
version="0.0.4",
author="dalongrong",
author_email="1141591465@qq.com",
description="a simple cli project",
long_description=long_description,
install_requires=['click'],
ext_modules= cythonize([add_extension]),
long_description_content_type="text/markdown",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
project_urls={
'Documentation': 'https://github.com/rongfengliang/cython-c-pip-demo.git',
'Say Thanks!': 'https://github.com/rongfengliang/cython-c-pip-demo.git',
'Source': 'https://github.com/rongfengliang/cython-c-pip-demo.git',
'Tracker': 'https://github.com/rongfengliang/cython-c-pip-demo.git',
},
entry_points={
'console_scripts': [
'podcli=cli:apply',
],
}
)
- cython make 构建
主要是简化了依赖项目的构建
LIB_DIR = ext
CLI_DIR = cli
default: pyadd
pyadd: setup.py $(CLI_DIR)/app.pyx $(LIB_DIR)/libadd.a
python3 setup.py build_ext --inplace && rm -f add_app.c && rm -Rf build && cp *.so cli/ && rm *.so
$(LIB_DIR)/libadd.a:
make -C $(LIB_DIR) libadd.a
clean:
rm *.so
构建&&测试
- 构建
make
效果
python3 setup.py build_ext --inplace && rm -f add_app.c && rm -Rf build && cp *.so cli/ && rm *.so
running build_ext
building 'add_app' extension
creating build
creating build/temp.macosx-10.13-x86_64-3.7
creating build/temp.macosx-10.13-x86_64-3.7/cli
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -I./cli -Iext -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/Users/dalong/mylearning/py-cli-demo/cpython-demo/include -I/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c ./cli/app.c -o build/temp.macosx-10.13-x86_64-3.7/./cli/app.o
creating build/lib.macosx-10.13-x86_64-3.7
clang -bundle -undefined dynamic_lookup -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk build/temp.macosx-10.13-x86_64-3.7/./cli/app.o -Lext -L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib -ladd -o build/lib.macosx-10.13-x86_64-3.7/add_app.cpython-37m-darwin.so
copying build/lib.macosx-10.13-x86_64-3.7/add_app.cpython-37m-darwin.so ->
- 安装
使用pip 本地安装
pip install .
- 测试调用代码
cli/init.py,集成了一个click 的cli 开发包
import click
import add_app
@click.command()
@click.option("--scale", default=1, help="Number to scale.")
@click.option("--pod", prompt="pod name",
help="The Pod counts.")
def apply(scale, pod):
"""Simple program that scale pod."""
results = add_app.py_add(scale,10)
print("pod scale with counts",pod,results)
if __name__ == '__main__':
apply()
- 使用
podcli --pod demo
效果
podcli --pod demo
pod scale with counts demo 11
说明
这个只是一个简单的学习,因为在学习一个开源框架中使用了 cython ,所以研究下,方便阅读源码,同时代码很简单,深入的还得多看看
官方文档
参考资料
https://medium.com/@shamir.stav_83310/making-your-c-library-callable-from-python-by-wrapping-it-with-cython-b09db35012a3
https://github.com/stavshamir/cython-c-wrapper/
https://cython.readthedocs.io/en/latest/src/tutorial/external.html
https://cython.readthedocs.io/en/latest/src/tutorial/clibraries.html
http://pages.cs.wisc.edu/~yezheng/post/cython/
https://github.com/rongfengliang/cython-c-pip-demo
python 集成cython 简单测试的更多相关文章
- python 集成cython && push 测试pip 仓库
昨天创建了一个简单的python 集成cython 的项目 master 但是有几个问题 目前的构建时基于make 同时需要本地执行,为了方便基于pip 的安装,做了如下调整 项目准备 项目使用ven ...
- Python实现一个简单三层神经网络的搭建并测试
python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- python内置模块之unittest测试(五)
系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) python模块分析之logging日志(四) pytho ...
- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda
---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...
- 【Python开发】python集成开发环境IDE搭建
http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件 Ubuntu / windows Python 2.7 / pytho ...
- windows和linux中搭建python集成开发环境IDE——如何设置多个python环境
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- windows和linux在建筑python集成开发环境IDE
http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件 Ubuntu / windows Python 2.7 / pytho ...
随机推荐
- 团队项目需求心得——慢阻肺疾病管理APP
一.项目介绍: 先上图: 这是我们小组开发项目的系统构成图. 本项目研发面向家庭/社区,对稳定期中慢阻肺患者病情和环境全方位监测.简单病情趋势分析和患者行为干预,并且提供患者与家庭医生和专家沟通渠道的 ...
- 用tensorflow实现最简单的神经网络
import tensorflow as tfimport numpy as np def add_layer(inputs,in_size,out_size,activation_function= ...
- 连接MySQL常用工具
database.properties 如下:url中coursesystem为将要连接的数据库名:username为该数据库设置权限时的用户名:如果设置了密码,再添一项password=你的密码 d ...
- 二、Memcached缓存穿透、缓存雪崩
二.Memcached缓存穿透.缓存雪崩 1. 缓存雪崩 可能是数据魏加载到缓存中,或者缓存同一时间大面积失效,导致大量请求去数据库查询的过程,数据库过载,崩溃. 解决方法: 1 采用加锁计数,使用合 ...
- struts2自定义转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...
- 简单理解 SVM
SVM,中文名叫支持向量机. 在深度学习出现以前,它是数据挖掘的宠儿: SVM具有十分完整的数据理论证明,但同时理论也相当复杂. 初识SVM 同其他分类算法一样,SVM分类也是寻找合适的决策边界,为 ...
- elasticsearch(3) 数据操作-更新
一 更新整个文档 更新整个文档的方法和存放数据的方式是相同的,通过PUT 127.0.0.1/test/test/1 我们可以把test/test/1下的文档更新为新的文档 例: PUT 127.0 ...
- ueditor的用法
今天做了一下百度富文本编辑器,遇到了一些问题,现在来总结一下: (1)jQuery没有引用,解决方法:引用jQuery并且放在所有的js前面 (2)没有报错,但是样式显示不出来.解决方法:css引用的 ...
- Matlab_ eval 批量定义变量
本文备忘 Matlab 中批量定义变量的方法. 参考: [1] matlab中批量赋值与声明变量(eval函数) [2] MathWorks eval 缘起与说明 当变量名称多到一定程度时,变量名的管 ...
- sql业务分割
create Function StrToTable(@str varchar(1000)) Returns @tableName Table ( str2table varchar(50) ) As ...