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 相关文章推荐
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
python从入门到精通(DAY 3)
Dec 20 Python
Python3计算三角形的面积代码
Dec 18 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
python实现自主查询实时天气
Jun 22 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
python for循环remove同一个list过程解析
Aug 14 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python学生管理系统的实现
Apr 05 Python
python安装sklearn模块的方法详解
Nov 28 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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
用session做客户验证时的注意事项
2006/10/09 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
实例解析php的数据类型
2018/10/24 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript AutoScroller 函数类
2009/05/29 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
Python实现的简单算术游戏实例
2015/05/26 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
python右对齐的实例方法
2020/07/05 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
Android面试题及答案
2015/09/04 面试题
机电一体化自荐信
2013/12/10 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
三方协议书范本
2014/04/22 职场文书
爱国演讲稿400字
2014/05/07 职场文书
边城读书笔记
2015/06/29 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
python 命令行传参方法总结
2021/05/25 Python
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电