首页 > 编程语言 >批量将python打包成.so文件(python将py编译成so)

批量将python打包成.so文件(python将py编译成so)

时间:2023-01-11 11:45:31浏览次数:41  
标签:文件 setup python 编译成 py so hello

1 首先为什么要将python打包成so文件

Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效。python的解释特性是将py编译为独有的二进制编码pyc文件,然后对pyc中的指令进行解释执行,但是pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要.因此需要将python文件打成so文件的目的就是为了保护源码。

2 下面就来实战如何将py文件打成so文件

(1) 准备工作:

首先需要安装如下相关包

python 安装:cython

pip install cython

linux 安装:python-devel,gcc

如果是centos版linux执行:

yum install python-devel
yum install gcc

如果是ubuntu版linux:

apt-get install python-devel
apt-get install gcc

(2) 新建一个待编译文件hello.py以及setup.py,

hello.py内容如下

def greet(str):
    return "hello " + str

setup.py内容如下

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello.py"]))

然后执行如下打包命令

python setup.py build_ext

执行完该命令后的会有什么变化呢?

首先会在同级目录下生成hello.c的文件以及一个build文件夹目录,在build文件夹目录里面存放着编译好的.so文件。

接下来来测试一下这个生成.so文件,首先写一个测试文件demo.py(和hello.py同一级目录)

from hello import greet
print(greet("tom"))

然后用命令python demo.py执行一下,结果是hello tom,一点都不意外,有同学就问,你这就测试完了吗。当然没有啊

其实真正测试之前,我们应该先将hello.py这个文件删除或者改一下名字,不然我们怎么知道

from hello import greet这条命令中的hello模块是hello.py文件还是对应生成的.so文件呢

接下来我将hello.py 删了,将打包编译生成的.so文件从build文件夹中移出来移到与demo.py同一级目录。

接下来再去测试,当然结果仍然返回的是hello tom。这就说明hello模块是来源于我们的.so文件中。

其实还有一个问题,就是上面测试的是打包一个.so文件,如果有许多个.py文件需要我们打包编译,是不是要重复的编写多个setup.py文件,答案是肯定不需要!!!接下来我就说一下如何同时打包多个.py文件

(3)如何同时打包多个py文件

上面打包1个.py(hello.py)文件的命令如下:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello.py"]))

现在如果我们有hello1.py,hello2.py,hello3.py,同时想将这么多个.py文件打包成.so文件,这时候我们就可以这样做,命令如下

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello1.py", "hello2.py","hello3.py"]))

其实不管你有多少个.py文件,统一写到cythonize里面就行了。

好的,本次将.py文件打包成.so文件的写完了,如果有疑问的话,请私信或者留言。

标签:文件,setup,python,编译成,py,so,hello
From: https://www.cnblogs.com/lidabo/p/17043275.html

相关文章

  • 怎么在C++中调用Python?C++调用python封装接口实例解析!
    看到标题很多小伙伴会问:不是都说python是胶水语言,他调用什么什么语言封装的库来做一些什么事情吗?怎么小编你这反而变成被调用的对象了呢?没错,常规情况下一般都是以python语......
  • Microsoft Office LTSC 2021 for Mac(office系列全套装) v16.69激活版
    哪里有全套装的office 2021mac版下载?office2021是一款由微软官方提供的最新office办公软件。office2021forMac从头开始设计,以利用最新的Mac功能,包括Retina显示、......
  • Requests+Etree+BeautifulSoup+Pandas+Path+Pyinstaller应用 | 获取页面指定区域数据
    (Requests+Etree+BeautifulSoup+Pandas+Path应用|获取页面指定区域数据存入html、excel文档)1需求来源获取网页指定区域数据,并进行保存;简单说就是pachong的需求了。......
  • Python实例浅谈之三Python与C/C++相互调用
    一、问题     Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结。二、Python调用C/C++1、Python调用C动态链接库       P......
  • Python - deepdiff简单使用
    Python-deepdiff目录aboutDeepDiffDeepSearchDeepHashDeepDiff在单元测试中的应用返回Python目录返回测试目录about#DeepDiff模块常用来校验两个对象......
  • 浅析 C++ 调用 Python 模块
    作为一种胶水语言,Python 能够很容易地调用 C 、 C++ 等语言,也能够通过其他语言调用 Python 的模块。Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中......
  • 极客编程python入门-图形界面
    图形界面Python支持多种图形界面的第三方库,包括:Tk、wxWidgets、Qt、GTK等等。第一步是导入Tkinter包的所有内容:fromtkinterimport*第二步是从​​Frame​​​派生一个​......
  • Python字符串
    1.字符串输出print('数据1','数据2','数据3',sep='',end='\n')数据与数据之间的连接sep=''数据输出之后的换行end='\n'2.字符串转义符转义字符描述......
  • 将Python文件发布成DLL并调用
    如何将Python文件发布成DLL供C/C++调用,试过两种思路:一种是用Cython将Python文件转为.c文件,但是简简单单4行代码,由于调用了NumPy,生成.c文件有5000+行,而且完全找不到原pyt......
  • 联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 示例
    联合学习(FL)是一种出色的ML方法,它使多个设备(例如物联网(IoT)设备)或计算机能够在模型训练完成时进行协作,而无需共享它们的数据。“客户端”是FL中使用的计算机和......