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微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
将Django项目部署到CentOs服务器中
Oct 18 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Python脚本去除文件的只读性操作
Mar 05 Python
什么是Python中的匿名函数
Jun 02 Python
python3中for循环踩过的坑记录
Dec 14 Python
详解Python中的文件操作
Jan 14 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
无限级别菜单的实现
2006/10/09 PHP
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
vue权限问题的完美解决方案
2019/05/08 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python内存管理实例分析
2019/07/10 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
python3.4中清屏的处理方法
2020/07/06 Python
python识别验证码的思路及解决方案
2020/09/13 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
应聘医学检验人员自荐信
2013/09/27 职场文书
学生档案自我鉴定
2013/10/07 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
小学数学课后反思
2014/04/23 职场文书
简历自我评价优缺点
2015/03/11 职场文书
家长会后的感想
2015/08/11 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
python井字棋游戏实现人机对战
2022/04/28 Python