思路是先将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文件实例相关推荐

  1. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

  2. Linux系统下生成证书 https证书

    平时都是用oneinstack加密https 现在因为本地调试 需要https 就找到这篇文章 Linux系统下生成证书 生成秘钥key,运行: $ openssl genrsa -des3 -out ...

  3. linux创建特殊文件rules,RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件

    RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件 1.确认在所有RAC节点上已经安装了必要的UDEV包 [root@rh2 ~]# rpm -qa|grep udev ...

  4. linux目录统计编程,linux系统编程----统计一个目录下的普通文件个数

    主要是为了统计linux系统下一个指定目录下面的普通文件个数,运用目录操作的一些函数,配合递归调用来实现该功能. 首先介绍一下函数原型: 打开一个空目录 DIR *opendir(const char ...

  5. VMware虚拟机的linux系统无法与主机复制粘贴文字以及文件解决办法

    VMware虚拟机的linux系统无法与主机复制粘贴文字以及文件解决办法 Ubuntu只需要输入两行代码: sudo apt-get autoremove open-vm-toolssudo apt- ...

  6. linux系统下shell命令使用通配符批量创建文件或目录

    linux系统下shell命令使用通配符批量创建文件或目录 批量创建log文件 批量创建文件夹 批量删除目录 批量创建log文件 touch {1..5}.log 批量创建文件夹 mkdir dir_ ...

  7. Linux系统下生成bit和mcs文件

    第一步:准备工作:蜂鸟E203项目和vivado软件下载到linux系统下 第二步:配置vivado软件快捷方式(有很多种配置的方法,这里建议使用这种) 打开终端,自动加载环境变量:         ...

  8. Linux系统rootfs切换到真正的根文件系统详细源码解析(附工作项目手动制作根文件实例)

    目录 一.简介 二.设计过程总结 2.1 busybox制作精简的文件系统并完成ramfs启动 2.2 通过精简的文件系统制作完整的文件系统并拷贝到硬盘 2.3 rootfs切换到真正的根文件配置 2 ...

  9. Linux系统python(虚拟)环境的迁移

    应用背景:前面在进行离线ocr实现时,需要在线安装好easyOCR工具包以及用于支持pdf图像提取的pdf2img包,然后将这个环境离线迁移到不能上网的centOS系统的生产环境服务器上,所以除了在能 ...

最新文章

  1. 使用 SQL Server 的 uniqueidentifier 字段类型
  2. 数据分析之Pandas合并操作总结
  3. 被5月GitHub Top20榜单惊呆了 原来区块链大佬都在做这个
  4. java解决跨域问题
  5. leetcode 617. Merge Two Binary Trees | 617. 合并二叉树(Java)
  6. python之scrapy爬取jd和qq招聘信息
  7. 重复T次的LIS的dp Codeforces Round #323 (Div. 2) D
  8. Keras与PyTorch全方位比较 哪一个深度学习框架更适合初学者?
  9. ApacheCN Pandas 教程集
  10. 亿达中国运用云服务,亿达中国打造智能园区
  11. wsdl2java 工具_apache CXF wsdl2java工具的使用
  12. 你值得拥有的Mac PS滤镜插件和特效处理软件合集,不要错过!
  13. 浙大计算机系2001届,我的大学十年(林锐博士).doc
  14. java斗地主代码花色,集合经典案例:斗地主发牌功能实现
  15. sqlserver 18456登录错误处理
  16. htc 8x android,HTC 8X正式发布 4.3寸屏支持NFC
  17. vuejs study
  18. WLAN技术之WLAN安全
  19. PLSQL界面打不开、PLSQL无法启动解决办法
  20. xss 全编码两次_XSS平台简单使用

热门文章

  1. 西安工业云上线 中服助力智能制造发展
  2. 使用html和css制作一个小米商城页面
  3. Windows Server 2008 R2 系统安装视频课程-深博-专题视频课程
  4. iOS七牛云上传图片
  5. 腾讯、阿里的城市大脑较量
  6. linux中修改mysql排序规则_MySQL中的排序规则
  7. 最新 Elasticsearch Kibana 7.6.2 之 Docker 安装
  8. matlab计算光纤有效折射率,使用matlab计算长周期光纤光栅的有效折射率
  9. Python 自定义函数的两种类型(wzl)
  10. LAMMPS实现MC模拟