Python生成加密so文件方法

3,025 阅读1分钟

1. so文件的作用

Python开发效率高,但是在效率上比不上C/C++;再者,某些时候我们想把一些关键性代码保护起来,我们可以将这些代码编译成C/C++的so库,然后使用Python去调用,达到保护源码的目的

2. python文件打包成so包

  1. 安装cython
pip install cython
  1. 新建一个待编译文件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")