一、Cpython介绍
文章来源:https://www.toymoban.com/news/detail-460608.html
文章来源地址https://www.toymoban.com/news/detail-460608.html
二、安装
三、使用方法
3.1、单个文件的编译示例-linux
test/├── test.py├── main.py
def hello():
print('hello!')
#!/usr/bin/python3.8
from test import hello
if __name__ == "__main__":
hello()
3.1.1、将启动main.py编译成二进制可执行文件main
# step1: 将python代码翻译成c代码(main.py -> main.c)cython -D -3 --directive always_allow_keywords=true --embed main.py# step2: 将c代码编译为目标文件(main.c -> main.o)gcc -c main.c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main.o# step3: 将目标文件编译为二进制可执行文件(main.o -> main)gcc main.o -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main
# step1: 将python代码翻译成c代码(main.py -> main.c)cython -D -3 --directive always_allow_keywords=true --embed main.py# step2: 将c代码编译为二进制可执行文件(main.c -> main)gcc main.c -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main
3.1.2、将test.py编译为动态链接库test.so
# step1: 将python代码翻译成c代码(test.py -> test.c)cython -D -3 --directive always_allow_keywords=true test.py# step2: 将c代码编译为linux动态链接库文件(test.c -> test.so)gcc test.c -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o test.so
-D, --no-docstrings, Strip docstrings from the compiled module.
-o, --output-file <filename> Specify name of generated C file
-2 Compile based on Python-2 syntax and code semantics.
-3 Compile based on Python-3 syntax and code semantics.
-shared:
编译动态库时要用到
-pthread:
在Linux中要用到多线程时,需要链接pthread库
-fPIC:
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-fwrapv:
它定义了溢出时候编译器的行为——采用二补码的方式进行操作
-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的
-O2:
会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
-O3: 在O2的基础上进行更多的优化
-Wall:
编译时 显示Warning警告,但只会显示编译器认为会出现错误的警告
-fno-strict-aliasing:
“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。
-I (大写的i):
是用来指定头文件目录
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-l:
-l(小写的 L)参数就是用来指定程序要链接的库,-l参数紧接着就是库名,把库文件名的头lib和尾.so去掉就是库名了,例如我们要用libtest.so库库,编译时加上-ltest参数就能用上了
3.2、单个文件的编译示例-windows
# step1: 将python代码翻译成c代码(test.py -> test.c)cython -D -3 --directive always_allow_keywords=true test.py# step2: 将c代码编译为windows动态链接库文件(test.c -> test.pyd)cythonize -i test.c最后得到windows下的动态链接库文件test.cp39-win_amd64.pyd,还需要将文件名重命名为test.pyd。
-b, --build build extension modules using distutils
-i, --inplace build extension modules in place using distutils(implies -b),即将编译后的扩展模块直接放在与test.py同级的目录中。
四、python编译可执行文件与动态链接库
五、参考
到了这里,关于cython编译加密python源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!