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 相关文章推荐
pygame学习笔记(4):声音控制
Apr 15 Python
连接Python程序与MySQL的教程
Apr 29 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
python开发之str.format()用法实例分析
Feb 22 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
pytorch梯度剪裁方式
Feb 04 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
详解JS模块导入导出
2017/12/20 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
Python的Flask框架中web表单的教程
2015/04/20 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Python continue继续循环用法总结
2018/06/10 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Python3几个常见问题的处理方法
2019/02/26 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
工厂门卫的岗位职责
2014/07/27 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android