4种Python文件或者文本加密的方式

需要注意的是 , 编译成pyc或者pyo文件后需要将命名改成与源Python命名一致 , 将其放在源目录下 , 虽然其他python文件调用pyd时显示不能检测到该模块 , 但实际上可以运行 。
私信小编01即可获取大量Python学习资料
由于pyc的编译收到python版本的影响 , 所以当将编译后的pyc迁移到另一台电脑中时 , 最好保持python环境一致 。
将python文件.py编译成pyc二进制文件:
python -m py_file.py或者通过脚本运行
import py_compile ##单个文件编译import compileall ##多个文件编译py_compile.compile('path') ##path是包括.py文件名的路径

将python文件编译成pyo二进制文件:
python -O -m py_file.pypyc是一种二进制文件 , 是由py文件经过编译后 , 生成的文件 , 是一种byte code , py文件变成pyc文件后 , 加载的速度有所提高 , 而且pyc是一种跨平台的字节码 , 是由python的虚拟机来执行的 , 这个是类似于JAVA或者.NET的虚拟机的概念 。
注意事项:pyc的内容 , 是跟python的版本相关的 , 不同版本编译后的pyc文件是不同的 , 2.5编译的pyc文件 , 2.4版本的 python是无法执行的 。 什么是pyo文件?pyo是优化编译后的程序 python -O 源文件即可将源程序编译为pyo文件
什么是pyd文件?
pyd是python的动态链接库 。 windows上为pyd文件,Linux上为so文件 , pyd文件实际就是dll文件 编译成pyd的方法如下:# 命令行下:(在项目目录下打开命令行或者shell , 该命令只能编译一个文件 , 编译之后会发现出现三个文件 , yourmod.c、yourmod.html、yourmod-win_amd64.pyd , 此时将c、html和原py文件删除 , 将pyd文件命名更改为yourmod就可以)cythonize -a -i yourmod.pyx
# python代码:(在原项目中编写setup.py文件)
from distutils.core import setupfrom Cython.Build import cythonizeimport os'''该文件的执行需要的在Terminal中输入 python setup.py build_ext --inplace !!!使用Cpython 编译python文件 , 关键函数编译成pyd文件(相当于dll)'''# 针对多文件情况设置 , 单文件就只写一个就行key_funs = ["yourmod1.py", "yourmod2.py", "yourmod3.py"]setup(name="XX app",ext_modules = cythonize(key_funs),)'''1、将编译后的pyd文件的命名更改成与原py文件一致2、删除编译后得到的c文件和原py文件'''print("——————", os.getcwd(), "——————")files = os.listdir(os.getcwd())print(files)for fi in files:if fi.__contains__(".pyd"):re_name = fi.split(".")[0] + ".pyd"print(re_name)os.rename(fi, re_name)elif fi.__contains__(".c") or fi in key_funs:os.remove(fi)# 运行方式 在原目录的命令行下执行python setup.py build_ext --inplace
3、将Python文件转成exe封装(文件加密)
参考:
4、采用hashlib或pycrypto模块进行文本加密
hashlib模块:
import hashlibsha1 = hashlib.sha1('文本内容') #加密osv=sha1.hexdigest()print(osv)bx=bytes(osv,encoding='utf-8') #转换类型with open('1.txt','wb') as f: #以二进制写类型打开f.write(bx) #写入文件get_sha1('')pycrypto模块:
from Crypto.Cipher import AESobj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')message = "The answer is no"ciphertext = obj.encrypt(message)>>> ciphertext'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'>>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')>>> obj2.decrypt(ciphertext)'The answer is no'


推荐阅读