linux系统python生成so_Python 项目转化为so文件实例
思路是先将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文件夹,如下
现在so文件就可以像普通py文件一样导入了
集成编译
做了以下内容:
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文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
时间: 2019-12-22
linux系统python生成so_Python 项目转化为so文件实例相关推荐
- 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...
阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...
- Linux系统下生成证书 https证书
平时都是用oneinstack加密https 现在因为本地调试 需要https 就找到这篇文章 Linux系统下生成证书 生成秘钥key,运行: $ openssl genrsa -des3 -out ...
- linux创建特殊文件rules,RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件
RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件 1.确认在所有RAC节点上已经安装了必要的UDEV包 [root@rh2 ~]# rpm -qa|grep udev ...
- linux目录统计编程,linux系统编程----统计一个目录下的普通文件个数
主要是为了统计linux系统下一个指定目录下面的普通文件个数,运用目录操作的一些函数,配合递归调用来实现该功能. 首先介绍一下函数原型: 打开一个空目录 DIR *opendir(const char ...
- VMware虚拟机的linux系统无法与主机复制粘贴文字以及文件解决办法
VMware虚拟机的linux系统无法与主机复制粘贴文字以及文件解决办法 Ubuntu只需要输入两行代码: sudo apt-get autoremove open-vm-toolssudo apt- ...
- linux系统下shell命令使用通配符批量创建文件或目录
linux系统下shell命令使用通配符批量创建文件或目录 批量创建log文件 批量创建文件夹 批量删除目录 批量创建log文件 touch {1..5}.log 批量创建文件夹 mkdir dir_ ...
- Linux系统下生成bit和mcs文件
第一步:准备工作:蜂鸟E203项目和vivado软件下载到linux系统下 第二步:配置vivado软件快捷方式(有很多种配置的方法,这里建议使用这种) 打开终端,自动加载环境变量: ...
- Linux系统rootfs切换到真正的根文件系统详细源码解析(附工作项目手动制作根文件实例)
目录 一.简介 二.设计过程总结 2.1 busybox制作精简的文件系统并完成ramfs启动 2.2 通过精简的文件系统制作完整的文件系统并拷贝到硬盘 2.3 rootfs切换到真正的根文件配置 2 ...
- Linux系统python(虚拟)环境的迁移
应用背景:前面在进行离线ocr实现时,需要在线安装好easyOCR工具包以及用于支持pdf图像提取的pdf2img包,然后将这个环境离线迁移到不能上网的centOS系统的生产环境服务器上,所以除了在能 ...
最新文章
- 使用 SQL Server 的 uniqueidentifier 字段类型
- 数据分析之Pandas合并操作总结
- 被5月GitHub Top20榜单惊呆了 原来区块链大佬都在做这个
- java解决跨域问题
- leetcode 617. Merge Two Binary Trees | 617. 合并二叉树(Java)
- python之scrapy爬取jd和qq招聘信息
- 重复T次的LIS的dp Codeforces Round #323 (Div. 2) D
- Keras与PyTorch全方位比较 哪一个深度学习框架更适合初学者?
- ApacheCN Pandas 教程集
- 亿达中国运用云服务,亿达中国打造智能园区
- wsdl2java 工具_apache CXF wsdl2java工具的使用
- 你值得拥有的Mac PS滤镜插件和特效处理软件合集,不要错过!
- 浙大计算机系2001届,我的大学十年(林锐博士).doc
- java斗地主代码花色,集合经典案例:斗地主发牌功能实现
- sqlserver 18456登录错误处理
- htc 8x android,HTC 8X正式发布 4.3寸屏支持NFC
- vuejs study
- WLAN技术之WLAN安全
- PLSQL界面打不开、PLSQL无法启动解决办法
- xss 全编码两次_XSS平台简单使用