当前位置:   article > 正文

【python】将py文件封装为库(pyd文件)_python怎么讲多个.py文件打包成一个.pyd文件

python怎么讲多个.py文件打包成一个.pyd文件

目录

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文件,作为要打包的源代码。

  1. # file: hello.py
  2. def say_hello_to(name):
  3. print(f"Hello {name}!")
'
运行

2.创建.pyx文件

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

  1. # file: hello.pyx
  2. def say_hello_to(name):
  3. print(f"Hello {name}!")
'
运行

3.创建setup.py文件

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

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

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

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

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

示例如下

执行命令前的用到的文件

执行命令后新生成的文件

5.测试pyd文件

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

用一个test.py来测试

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

运行结果

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

可以看到测试成功

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

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

1.创建setup.py

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

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

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

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

python setup.py build_ext --inplace

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

示例:

需打包的py文件情况如下

DataTool.py内容为

  1. # file: DataTool.py
  2. def format_data(x: int) -> int:
  3. return x*100
'
运行

OrderTool.py内容为

  1. #file: OrderTool.py
  2. def divide_quantity(quantity: int, num: int) -> list:
  3. k = quantity//(num*100)
  4. rest = quantity - k*num*100
  5. ret = [100*k for i in range(num)]
  6. for i in range(num):
  7. if rest >= 100:
  8. ret[i] += 100
  9. rest -= 100
  10. elif rest > 0:
  11. ret[i] += rest
  12. rest = 0
  13. else:
  14. break
  15. return ret
'
运行

setup.py文件内容为

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

执行命令

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

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

3.测试

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

  1. from DataTool import *
  2. from OrderTool import *
  3. if __name__ == '__main__':
  4. x = 27
  5. data = format_data(x)
  6. print(data)
  7. divide_ret = divide_quantity(data, 5)
  8. print(divide_ret)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1015767
推荐阅读
相关标签
  

闽ICP备14008679号