Python 项目转化为so文件实例


Posted in Python onDecember 23, 2019

思路是先将py转换为c代码,然后编译c为so文件,所以要安装以下内容:

python 安装:cython

pip install cython

linux 安装:python-devel,gcc

yum install python-devel
yum install gcc

初步编译

新建Test.py文件,内容如下

class test:
  
  def __init__(self):
    print('init')

  def say(self):
    print ('hello')

新建setup.py,内容如下

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(["Test.py"]))

在bash中执行

python setup.py build_ext

运行后会生成build文件夹,如下

Python 项目转化为so文件实例

现在so文件就可以像普通py文件一样导入了

Python 项目转化为so文件实例

集成编译

做了以下内容:

1.文件夹编译

2.删除编译出的.c文件

3.删除编译的temp文件夹

将需要编译的目录和setup.py放在同一层级,执行python setup.py,so文件在build目录下

setup.py代码如下:

'''
Created on 2019年3月27日

@author: hylink
'''
#-* -coding: UTF-8 -* -

"""
执行前提:
  系统安装python-devel 和 gcc
  Python安装cython

编译整个当前目录:
  python py-setup.py
编译某个文件夹:
  python py-setup.py BigoModel

生成结果:
  目录 build 下

生成完成后:
  启动文件还需要py/pyc担当,须将启动的py/pyc拷贝到编译目录并删除so文件

"""

import sys, os, shutil, time
from distutils.core import setup
from Cython.Build import cythonize

starttime = time.time()
currdir = os.path.abspath('.')
parentpath = sys.argv[1] if len(sys.argv)>1 else ""
setupfile= os.path.join(os.path.abspath('.'), __file__)
build_dir = "build"
build_tmp_dir = build_dir + "/temp"

def getpy(basepath=os.path.abspath('.'), parentpath='', name='', excepts=(), copyOther=False,delC=False):
  """
  获取py文件的路径
  :param basepath: 根路径
  :param parentpath: 父路径
  :param name: 文件/夹
  :param excepts: 排除文件
  :param copy: 是否copy其他文件
  :return: py文件的迭代器
  """
  fullpath = os.path.join(basepath, parentpath, name)
  for fname in os.listdir(fullpath):
    ffile = os.path.join(fullpath, fname)
    #print basepath, parentpath, name,file
    if os.path.isdir(ffile) and fname != build_dir and not fname.startswith('.'):
      for f in getpy(basepath, os.path.join(parentpath, name), fname, excepts, copyOther, delC):
        yield f
    elif os.path.isfile(ffile):
      ext = os.path.splitext(fname)[1]
      if ext == ".c":
        if delC and os.stat(ffile).st_mtime > starttime:
          os.remove(ffile)
      elif ffile not in excepts and os.path.splitext(fname)[1] not in('.pyc', '.pyx'):
        if os.path.splitext(fname)[1] in('.py', '.pyx') and not fname.startswith('__'):
          yield os.path.join(parentpath, name, fname)
        elif copyOther:
            dstdir = os.path.join(basepath, build_dir, parentpath, name)
            if not os.path.isdir(dstdir): os.makedirs(dstdir)
            shutil.copyfile(ffile, os.path.join(dstdir, fname))
    else:
      pass

#获取py列表
module_list = list(getpy(basepath=currdir,parentpath=parentpath, excepts=(setupfile)))
try:
  setup(ext_modules = cythonize(module_list),script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])
except Exception as e:
  print (e)
else:
  module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), copyOther=True))
module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), delC=True))
if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)
print ("complate! time:", time.time()-starttime, 's')

注意问题

1.编译后执行需要相同的python版本和编码

2.py中使用__file__内置变量的文件编译后调用时会出问题,暂时没有解决,还需要使用pyc代替

3.使用时注意权限控制

以上这篇Python 项目转化为so文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于twisted实现简单的web服务器
Sep 29 Python
Python中处理时间的几种方法小结
Apr 09 Python
Python中元组,列表,字典的区别
May 21 Python
对python中Json与object转化的方法详解
Dec 31 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
python实现海螺图片的方法示例
May 12 Python
Python class的继承方法代码实例
Feb 14 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
python适合做数据挖掘吗
Jun 16 Python
Python collections.deque双边队列原理详解
Oct 05 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python 解决cv2绘制中文乱码问题
Dec 23 #Python
python 实现查询Neo4j多节点的多层关系
Dec 23 #Python
python 多进程队列数据处理详解
Dec 23 #Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 #Python
python读取ini配置文件过程示范
Dec 23 #Python
python读取Kafka实例
Dec 23 #Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 #Python
You might like
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python实现视频读取和转化图片
2019/12/10 Python
python中get和post有什么区别
2020/06/19 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
北承题目(C++)
2012/05/16 面试题
优秀求职自荐信怎样写
2013/12/18 职场文书
企业文化建设实施方案
2014/03/22 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
求职简历自我评价2015
2015/03/10 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
Python pygame实现中国象棋单机版源码
2021/06/20 Python
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
python中pymysql包操作数据库方法
2022/04/19 Python