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多线程学习资料
Dec 19 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
解决python使用list()时总是报错的问题
May 05 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
详解Python函数print用法
Jun 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
JS控制表格隔行变色
2006/06/26 Javascript
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
python登陆asp网站页面的实现代码
2015/01/14 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
数学兴趣小组活动总结
2014/07/08 职场文书
工程承包协议书范本
2014/09/29 职场文书
团代会邀请函
2015/02/02 职场文书
python Polars库的使用简介
2021/04/21 Python
Python合并pdf文件的工具
2021/07/01 Python