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中yield生成器的用法
Aug 05 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
python类的继承实例详解
Mar 30 Python
Python随机读取文件实现实例
May 25 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
python 基于opencv实现高斯平滑
Dec 18 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
默默简单的写了一个模板引擎
2007/01/02 PHP
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
Javascript的比较汇总
2016/07/25 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
高分子材料个人求职信范文
2013/09/25 职场文书
什么是岗位职责
2013/11/12 职场文书
大学军训感言400字
2014/03/11 职场文书
洗车工岗位职责
2014/03/15 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
详解Python牛顿插值法
2021/05/11 Python
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
PHP正则表达式之RCEService回溯
2022/04/11 PHP