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脚本实现自动发带图的微博
Apr 27 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
python实现简单淘宝秒杀功能
May 03 Python
详解python中init方法和随机数方法
Mar 13 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
python3代码中实现加法重载的实例
Dec 03 Python
pandas取dataframe特定行列的实现方法
May 24 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
Python中is和==的区别详解
2018/11/15 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
Python将字典转换为XML的方法
2020/08/01 Python
浅析NumPy 切片和索引
2020/09/02 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
几道Java和数据库的面试题
2013/05/30 面试题
人力资源经理自我评价
2014/01/04 职场文书
促销活动计划书
2014/05/02 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Android实现图片九宫格
2022/06/28 Java/Android