【python】将py文件封装为库(pyd文件)
创始人
2024-12-03 00:03:40
0

目录

0.封装作用

1.安装cython库

2.封装示例

例子1:将一个py文件封装为pyd文件

1.创建.py文件

2.创建.pyx文件

3.创建setup.py文件

4.执行编译命令生成pyd文件

5.测试pyd文件

例子2:一次性生成多个pyd文件

1.创建setup.py

2.在命令行中编译生成.pyd文件

3.测试


0.封装作用

不想公开重要部分源码。pyd文件是由c中间文件编译生成的模块文件,类似so和dll库文件等,不易反编译出源码。

1.安装cython库

pip install Cython

2.封装示例

例子1:将一个py文件封装为pyd文件

1.创建.py文件

首先,需要有一个Python的.py文件,作为要打包的源代码。

# file: hello.py def say_hello_to(name):     print(f"Hello {name}!")

2.创建.pyx文件

很简单,就是创建一个后缀为.pyx的文件,然后将py文件中的代码复制过来即可

# file: hello.pyx def say_hello_to(name):     print(f"Hello {name}!")

3.创建setup.py文件

为了将Cython的.pyx文件编译生成.pyd文件,需要创建一个setup.py文件。

以下为示例代码,将hello_cython.pyx生成一个名为hello_cython.pyd的文件

# file: setup.py from distutils.core import setup from Cython.Build import cythonize  setup(name='Hello world app',       ext_modules=cythonize("hello.pyx"))

4.执行编译命令生成pyd文件

cd 到代码目录所在位置 D:\Python3.6.6\python.exe setup.py build_ext --inplace

示例如下

执行命令前的用到的文件

执行命令后新生成的文件

5.测试pyd文件

pyd文件名为hello.cp36-win_amd64.pyd,前缀为hello,因此模块名为hello

用一个test.py来测试

# file: test.py import hello if __name__ == "__main__":     hello.say_hello_to("xxx")   # xxx

运行结果

D:\Python3.6.6\python.exe D:\projects\python_lib\test.py  Hello xxx!  Process finished with exit code 0

可以看到测试成功

例子2:一次性生成多个pyd文件

下面给出另一个具体的例子,将工作路径切换到src目录下,打包该目录下所有的.py文件为.pyd文件

1.创建setup.py

在src目录下,创建setup.py文件,输入以下内容:

# setup.py from distutils.core import setup from Cython.Build import cythonize import os directory = '.'  # 设置源代码所在的目录,这里设置为当前目录 # 获取该目录下所有的文件名 sources = [os.path.join(directory, file)             for file in os.listdir(directory)             if file.endswith('.py')] setup(     ext_modules=cythonize(sources) )

2.在命令行中编译生成.pyd文件

在命令行中,切换到src目录下,执行以下编译命令:

python setup.py build_ext --inplace

执行该命令后,会在src目录下生成一些.pyd文件,这些文件与相应的.py文件位于同一目录下

示例:

需打包的py文件情况如下

DataTool.py内容为

# file: DataTool.py  def format_data(x: int) -> int:      return x*100

OrderTool.py内容为

#file: OrderTool.py  def divide_quantity(quantity: int, num: int) -> list:     k = quantity//(num*100)     rest = quantity - k*num*100     ret = [100*k for i in range(num)]     for i in range(num):         if rest >= 100:             ret[i] += 100             rest -= 100         elif rest > 0:             ret[i] += rest             rest = 0         else:             break      return ret

setup.py文件内容为

# setup.py from distutils.core import setup from Cython.Build import cythonize import os directory = '.'  # 设置源代码所在的目录,这里设置为当前目录 # 获取该目录下所有的文件名 sources = [os.path.join(directory, file)             for file in os.listdir(directory)             if file.endswith('.py') and file not in ["main.py"]] setup(     ext_modules=cythonize(sources) )

执行命令

cd 到py文件所在目录 D:\Python3.6.6\python.exe setup.py build_ext --inplace

然后就可以看到新生成的很多文件了,其中就有我们需要的pyd文件

3.测试

测试一下,我们将源代码文件DataTool.py和OrderTool.py从当前目录移动到其他文件夹去,来测试pyd文件是否有效。main.py文件内容如下

from DataTool import * from OrderTool import *  if __name__ == '__main__':     x = 27     data = format_data(x)     print(data)     divide_ret = divide_quantity(data, 5)     print(divide_ret)

运行结果如下,可以看到是有效的

相关内容

热门资讯

一分钟教你!广东雀神外 挂(一... 一分钟教你!广东雀神外 挂(一贯真的是有挂)详细透视辅助教程1.广东雀神外 挂 ai辅助创建新账号,...
微扑克辅助器ios!微扑克网页... 微扑克辅助器ios!微扑克网页版辅助,微扑克真的有挂存在(都是真的是有挂);无聊就玩这款微扑克真的有...
重大来袭!都莱罗松(本来真的是... 重大来袭!都莱罗松(本来真的是有挂)详细透视辅助教程1、打开软件启动之后找到中间准星的标志长按。2、...
微扑克辅助软件!微扑克有挂(透... 微扑克辅助软件!微扑克有挂(透明挂)好像是有挂1、微扑克系统规律教程、微扑克辅助透视等服务,为用户提...
玩家必知教程!金州水鱼辅助工具... 玩家必知教程!金州水鱼辅助工具(一贯是真的有挂)详细辅助教程所有人都在同一条线上,像星星一样排成一排...
最新技巧!!福建众娱软件有没有... 最新技巧!!福建众娱软件有没有辅助(透明挂)透明挂透视辅助脚本(2023已更新)(哔哩哔哩);福建众...
科普分享!心悦填大坑总输怎么回... 科普分享!心悦填大坑总输怎么回事(确实有挂)详细透视辅助教程1、心悦填大坑总输怎么回事系统规律教程、...
分享认知!柳州天天爱麻将有挂吗... 分享认知!柳州天天爱麻将有挂吗(透视)透明挂透视辅助脚本(2023已更新)(哔哩哔哩);1、金币登录...
记者揭秘!衢州都莱十三道辅助器... 记者揭秘!衢州都莱十三道辅助器(切实是有挂)详细辅助教程1、衢州都莱十三道辅助器ai机器人多个强度级...
玩家必知教程!!卡农斗牛辅助最... 玩家必知教程!!卡农斗牛辅助最新版本(透视)透视脚本辅助插件(2021已更新)(哔哩哔哩)运卡农斗牛...