赞
踩
目录
不想公开重要部分源码。pyd文件是由c中间文件编译生成的模块文件,类似so和dll库文件等,不易反编译出源码。
pip install Cython
首先,需要有一个Python的.py文件,作为要打包的源代码。
- # file: hello.py
- def say_hello_to(name):
- print(f"Hello {name}!")
'运行
很简单,就是创建一个后缀为.pyx的文件,然后将py文件中的代码复制过来即可
- # file: hello.pyx
- def say_hello_to(name):
- print(f"Hello {name}!")
'运行
为了将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"))
- cd 到代码目录所在位置
- D:\Python3.6.6\python.exe setup.py build_ext --inplace
示例如下
执行命令前的用到的文件
执行命令后新生成的文件
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
可以看到测试成功
下面给出另一个具体的例子,将工作路径切换到src目录下,打包该目录下所有的.py文件为.pyd文件
在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)
- )
在命令行中,切换到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文件
测试一下,我们将源代码文件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)
运行结果如下,可以看到是有效的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。