Python生成加密so文件方法
1. so文件的作用
Python开发效率高,但是在效率上比不上C/C++;再者,某些时候我们想把一些关键性代码保护起来,我们可以将这些代码编译成C/C++的so库,然后使用Python去调用,达到保护源码的目的
2. python文件打包成so包
- 安装cython
pip install cython
- 新建一个待编译文件hello.py以及setup.py
hello.py内容如下:
def greet(str):
return "hello " + str
setup.py内容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello.py"]))
执行如下打包命令:
python setup.py build_ext
命令执行完成以后,会在同级目录下生成hello.c的文件以及一个build文件夹目录,在build文件夹目录里面存放着编译好的.so文件。
如果需要打包多个py文件,修改setup.py内容:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello1.py", "hello2.py","hello3.py"]))
2.2 C++/c打包成so包方法
写一个C++的文件,add.cpp:
#include <iostream>
using namespace std;
extern "C"{
double add(int x1, int x2){
return x1+x2;
}
void print_msg(const char* s){
cout<<s;
}
}
int main(){
int a = 1;
int b =2 ;
int c;
c = add(a,b);
return c;
}
需要注意一点,C++中的函数需要extern "C"来转成C语法编译,因为C++函数是可以重载的,使用g++编译函数会附上额外信息而不是函数名本身,比方void print(int a);使用g++编译会生成print_int之类的,这样cdll.LoadLibrary的时候会找不到。所以,我们需要让编译器使用C方法编译,这样才能达到目的。
编译成库文件:
g++ add.cpp -fpic -shared -o libadd.so
在python文件中调用:
# _*_ encoding : utf-8 _*_
import os
from ctypes import *
lib = cdll.LoadLibrary(os.getcwd() + "/libadd.so")
lib.add.restype = c_double
input_1 = 100
input_2 = 200
result1 = lib.add(input_1,input_2)
result2 = lib.main()
print(result1, result2)
lib.print_msg(b"This string will be printed\n")
转载自:https://juejin.cn/post/6983841296390193183