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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
python中使用mysql数据库详细介绍
Mar 27 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python sys.argv[]用法实例详解
May 25 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
Django Celery异步任务队列的实现
Jul 24 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
python面向对象版学生信息管理系统
Jun 24 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
DIY实用性框形天线
2021/03/02 无线电
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
JS中Location使用详解
2015/05/12 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Python实现直播推流效果
2019/11/26 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
九年级英语教学反思
2014/01/31 职场文书
会计核算科岗位职责
2014/03/19 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
三人合伙协议书范本
2014/10/29 职场文书
订货会主持词
2015/07/01 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android