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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python使用CMD模块更优雅的运行脚本
May 11 Python
Python网络编程 Python套接字编程
Sep 13 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
python实现人工智能Ai抠图功能
Sep 05 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
Python文件的操作示例的详细讲解
Apr 08 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 SQL防注入代码集合
2008/04/25 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
常用js脚本
2006/12/03 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python使用turtle绘制分形树
2018/06/22 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
python 字符串格式化的示例
2020/09/21 Python
python利用faker库批量生成测试数据
2020/10/15 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
大众服装店创业计划书范文
2014/01/01 职场文书
自动化职业生涯规划书范文
2014/01/03 职场文书
车队司机自我鉴定
2014/03/02 职场文书
吨的认识教学反思
2014/04/27 职场文书
医德医风自我评价
2014/09/19 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
Oracle中DBLink的详细介绍
2022/04/29 Oracle
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL