Python有py、pyc、pyw、pyo、pyd等文件格式,其中除py其他格式起到了不暴露源码的作用,相当于c语言中的动态库。Python的脚本文件是开源的,若直接发布桌面软件问题很严重。因为这是公司的产品,需要保护源码。那么要对Python代码进行混淆加密保护。Python有py、pyc、pyw、pyo、pyd等文件格式。其中,pyc是二进制文件。但很容易被反编译。pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。pyo和pyc差不多,也容易被反编译。最后剩下pyd格式。pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。该文件目前位置没找到可以被反编译的消息,只能被反汇编。Sublime text编辑器也是使用该格式。本文则就如何将py文件生成pyd文件并进行调用的具体过程进行介绍。
一、安装Cython
进入python报的安装目录,输入pip命令进行安装Cython,具体命令代码如下:
pip install Cython
执行命令后的结果如下所示:本文选择的是python 3.7 环境,执行完毕后,则安装Cython成功。
二、创建工作目录并生成pyd文件
1.创建src文件目录
本文中在“1封装Python代码”目录下,创建src源码文件夹目录,其项目结构如下图所示
2.创建需要隐藏源码的py文件,并书写代码
本文中创建名称为“personMana.py”的文件,该文件内部封装了名称为“personMana”的类,该类中定义了两个方法名称分别为“say()”函数和“sayTest()”函数.具体代码如下:
class personMana:
def __init__(self):
print("")
#自定义函数
def say(self,lanage):
_lanage="您输入的内容是-》"+str(lanage)
return _lanage
def sayTest(self,msg, name):
_res=msg+name
return _res
3.书写将py文件生成pyd文件的代码
创建名称为“setup.py"来存储py文件生成pyd文件的代码。 本文主要将src目录下的所有py文件生成pyd文件,由于本文只生成personMana.py文件,而“setup.py”文件不需要生成,具体代码实现如下:
# setup.py
import shutil
from distutils.core import setup
from Cython.Build import cythonize
import os
directory = '.' # 设置源代码所在的目录,这里设置为当前目录
to_directory='../app/'#设置将需要调用的pyd文件拷贝的应用目录下
# 获取该目录下所有的文件名
sources = [os.path.join(directory, file)
for file in os.listdir(directory)
if file.endswith('.py') and file not in ["main.py"] and file not in ["setup.py"]]
setup(
ext_modules=cythonize(sources)
)
#复制文件到应用目录
exesource = [os.path.join(directory, file)
for file in os.listdir(directory)
if file.endswith('.pyd')]
for a in exesource:
fpath, fname = os.path.split(a)
#将生成的pyd文件拷贝到应用的目录中
shutil.copy(a, to_directory + fname.replace('.cp37-win_amd64','')) # 复制文件
4.运行setup.py文件,得到需要的结果
第一种运行方式:
在PyCharm Community Edition 2021.2.1工具中运行,首先配置形参其命令如下:
build_ext --inplace
接着选择Python解释器
第二种运行方式
通过命令进行运行,命令如下
python setup.py build_ext --inplace
5.在app目录下建立main.py文件调用该类
具体代码如下
from personMana import *
if __name__ == '__main__':
_personMana=personMana()
ce=_personMana.say("张三")
print(ce)
ce = _personMana.sayTest("你好","张三")
print(ce)
运行结果如下
三、具体代码连接如下: