0. 背景
当有些模块的代码需要一定的保密性,这个时候就需要考虑pyc和pyd文件了。今天就好好琢磨一下这两种文件的生成和使用方法。让自己的知识能够朝着商业化的方向再前进一步。
1. pyc文件的生成
首先编辑名称为Calcupart.py
的测试文件
"""
@author:George
@file: Calcupart.py
@time: 2023/07/25
@e-mail:gaoxin_hit@163.com
"""
class Section():
def __init__(self, Do, Di, fc, Fz):
self.Do = Do
self.Di = Di
self.fc = fc
self.Fz = Fz
def Check_ULS(self):
A = 3.1416/4*(self.Do**2 - self.Di**2)
F_R = A*self.fc
index = "OK" if F_R/1000 >= self.Fz else "Not OK"
return {"index_ULS": index, "A": A, "F_R": F_R/1000,
"Fz": self.Fz, "SM": F_R/1000/self.Fz}
然后在另一个文件中采用py_compile
模块,运行tgd02.py
文件。
"""
@author:George
@file: tgd02.py
@time: 2023/07/25
@e-mail:gaoxin_hit@163.com
"""
import py_compile
py_compile.compile(r'D:\PythonProject\Testpycd\Calcupart.py')
完毕以后查看项目文件夹下名称为__pycache__
的文件夹,其中名称为Calcupart.cpython-38.pyc
的文件便是生成的pyc文件。
将其单独放入新的项目中,直接引用即可(需要将文件名称改为原来的模块名,即应该将文件名称中“.cpython-38”字符删除)。
不过,需要说明的是,如果打开pyc文件可以发现,有部分源代码还是可以看见的。
以上,便是单个文件编译成*.pyc文件的全过程。还有批量编译的,目前我个人还没有这样的需求,等用到了再说(如果文件不是很多的话我还是愿意逐一编译)。
另外还有一个问题,当前编译的这个模块没有引用到其他模块,如果编译的模块引用到了其他模块,那么有没有其他需要特别注意的问题?这也是需要留意的。
2. pyd文件的生成
pyd文件的生成要比pyc的生成过程要麻烦一些。
首先需要创建setup.py
文件
from setuptools import setup
from Cython.Build import cythonize
setup(
name="XXXXX", # 这个位置我也不确定有什么用,随便写吧!
ext_modules=cythonize("Calcupart.py") # 这里放入需要生成为pyd文件的py文件
)
然后在terminal控制台执行如下指令进行编译,我是控制台所在文件路径切换到当前目录下的(Pycharm里面其实不用切换,直接就在当前项目所在目录下)
python setup.py build_ext --inplace
我在执行上面这一句的时候给出了如下报错:
Microsoft Visual C++ 14.0 or greater is required.
这时需要在微软官网下载"Microsoft C++ Build Tools"这个工具(具体方式可以参考这里),然后安装如下组件:
最后,再重新在控制台运行上述命令即可。pyd文件将会出现在项目文件夹下的build——>lib.win-amd64-cpython-38文件夹里,我这边的名称是Calcupart.cp38-win_amd64.pyd
必须注意,pyd文件的使用和pyc有些不同,使用的时候必须将pyd文件的名称改为原来对应的py文件的名称(后缀不用改),否则会出现引用不了的情况!
3. 两者的异同
首先,pyd文件的保密性要更好一些。下面的截图是pyd文件打开后的情形。完全看不到源码。
其次,个人感觉pyd就像是仅仅把py文件加密而已,即使源文件(*.py)引用了其他模块,也不要紧。这种方式是我比较喜欢的。点赞!