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 os模块学习笔记
Jun 21 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
python打开使用的方法
Sep 30 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
Python页面加载的等待方式总结
Feb 28 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php模板之Phpbean的目录结构
2008/01/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
Yii框架安装简明教程
2020/05/15 PHP
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
Selenium的使用详解
2018/10/19 Python
python处理“
2019/06/10 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
python字典按照value排序方法
2020/12/28 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
StringBuilder和String的区别
2015/05/18 面试题
汽车维修专业个人求职信范文
2014/01/01 职场文书
参观考察邀请函范文
2014/01/29 职场文书
查摆问题整改措施
2014/10/24 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
MySQL数据库 任意ip连接方法
2022/05/20 MySQL