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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
Python中暂存上传图片的方法
Feb 18 Python
Python smtplib实现发送邮件功能
May 22 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
python适合人工智能的理由和优势
Jun 28 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Pandas对每个分组应用apply函数的实现
Dec 13 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 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生成静态html文件的三种方法
2013/06/18 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python进程间通信之共享内存详解
2017/10/30 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
2014年五一劳动节社区活动总结
2014/04/14 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书