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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
详解Python中的Cookie模块使用
Jul 06 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
flask session组件的使用示例
Dec 25 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
Python实现Linux监控的方法
May 16 Python
python解释器spython使用及原理解析
Aug 24 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 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
自动跳转中英文页面
2006/10/09 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js实现表格字段排序
2014/02/19 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
详解vue axios中文文档
2017/09/12 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
.NET方向面试题
2014/11/20 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
缴纳养老保险的证明
2014/01/10 职场文书
yy结婚证婚词
2014/01/10 职场文书
运动会广播稿60字
2014/01/15 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
小学班主任心得体会
2016/01/07 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
关于EntityWrapper的in用法
2022/03/22 Java/Android